如何在另一个目录中分离托管和非托管DLL

时间:2012-04-06 13:56:43

标签: .net dll unmanaged .net-assembly

我的发布文件夹是:

MyApp.exe
MyManagedDLL.dll
NativeDLL.dll

MyApp使用托管的dll调用pinvoke本机dll。 我试图将它们移动到另一个子文件夹文件夹,我再次引用托管dll,当我运行我的应用程序时,它说它找不到NativeDLL.dll。如何解决?

1 个答案:

答案 0 :(得分:2)

Windows不知道它需要查找DLL的子目录。从包含EXE的文件夹开始,它只会查看DLL的少数几个位置。让它变得艰难,因为它不是很有效率。但你可以通过设置SetDllDirectory()来帮助它。请记住,您的用户不会关心DLL的位置。 IT部门倾向于支持简单的解决方案,当应用程序本身改变Windows搜索路径时解决DLL加载问题从来没有乐趣。

允许AnyCPU可执行文件在32位和64位模式下运行是一种合理的方法。您将使用两个目录,一个使用32位版本的DLL,另一个使用64位版本。并相应地根据IntPtr.Size的值调整SetDllDirectory。

[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern bool SetDllDirectory(string lpPathName);