2011-08-14 37 views
0

我在Windows CE上有一个.NET Compact Framework(CF)应用程序,它与本地的某些DLL文件进行交互,并且该应用程序有一些未知的行为和问题。如何在.NET Compact Framework中使用加载和卸载原生DLL文件?

现在,我使用的是直接调用使用函数[DllImport]属性,定义一个方法:

[DllImport("mynative.dll")] 
private static extern void HelloWorld(byte[] arrName); 

我想尝试释放加载的库,和网络研究表明我LoadLibraryFreeLibrary 。我如何找到教程或示例代码?

堆栈 溢出问题How to dynamically load and unload a native DLL file?是一个桌面示例,但它如何为Compact Framework做? 请注意,.NET Compact Framework没有'Marshal.GetFunctionPointerForDelegate'方法。

+0

您不需要手动“释放”库。你现在在做什么就好了。 –

+0

@Cody,但在5或6函数调用DLL后,我面临一些问题。例如,我的Windows窗体不会通过单击关闭按钮而不通过代码:this.Close()来关闭。这是惊人的,经过3/4次,这种行为不会出现。 – losingsleeep

+3

然后你的DLL有内存泄漏或其他问题。你的问题是问关于错误的问题。您应该修复引起* *的任何事情,而不是。 FreeLibrary不会奇迹般地修复错误的代码。 –

回答

1

CF运行时本身为P/Invokes调用LoadLibrary - 它会为你使用的每个不同的“版本”DLL调用它(所以如果你在一个地方使用“mynative.dll”而在另一个地方使用“mydll”它会被调用两次)。

从该调用返回的句柄不会暴露给应用程序,也不应该。有没有办法,关闭应用程序,以使运行时调用该DLL上的FreeLibrary,所以无法释放它。

虽然它的确行得通,但我不得不同意@Cody Gray对这个问题的评论,但它并不能解决问题。您需要实际找到并修复导致您看到不良行为的错误。

+0

谢谢你们的帮助。我的本地DLL执行一些进程并填充byte []输出参数并将程序流返回到.NET并继续。当一切正常工作时,我怎么能找到问题出在哪里? – losingsleeep

+0

您应该为您的DLL编写本地测试工具并使用本机调试器进行调试。您还可以通过在配置属性>调试>远程可执行文件字段下的DLL项目设置中设置托管应用程序来调试原生DLL。请注意,您需要完整的部署设备路径到您的可执行文件。 – Damon8or

相关问题