DllImport生成System.DllNotFoundException

我在尝试从我的应用程序中使用非托管代码dll时遇到了一些困难(用C#framework 4.0编写)。 我正在使用dll导入如下

 [DllImport(@"C:\MGW_SDK.dll", EntryPoint = "fInicializaSDK")] public static extern int fInicializaSDK(); 

奇怪的是,从我的开发环境(Windows XP)调用时,它工作得很好,但是当在生产服务器(Windows7)上时,它会生成以下exception:

System.DllNotFoundException :无法加载' C:\MGW_SDK.dll' :找不到指定的模块。 (来自HRESULT的exception:0x8007007E) Comtpaq.AdminPack.AdminPaqRepository.InitializeSDK()位于C:\Work\AgroIn\AdminPaqRepository.cs中的Comtpaq.AdminPack.AdminPaqRepository.InitializeSDK() :第30行

我已经运行了Dependency Walker ,它显示以下依赖项是冲突的: C:\windows\system32\SHLWAPI.DLL

我已经尝试将该dll复制到我的部署目录

MGW_SDK.dllc:\ (如路径所示)

我已经安装了C运行时库

我还注意到一些有趣的东西:在例外情况下,开发路径显示C:\Work\AgroIn\AdminPaqRepository.cs:line 30

还有什么可能是这里的问题?

编辑

我用MGW_SDK.dll一个extern / dllimport方法构建了一个小型控制台应用程序并且运行它没有任何问题(没有任何DllNotFoundException ),所以这似乎与我正在构建的应用程序有关(a WCF服务)。 此服务托管在WAS上,但我仍然无法找到问题。

嗯,这是一个非常棘手的问题。 它与dll依赖关系无关,也与dll位置无关。 这不是关于我如何调用DllImport 。 这是一个权限问题。

基本上这个问题是通过在dll所在的文件夹中取出然后再添加执行权限来解决的。 见本文 (Wayback机器)。


Oracle 9.2客户端软件要求您通过以下步骤为Oracle Home提供Authenticated User特权:

  1. 以具有管理员权限的用户身份登录Windows。

  2. 从“开始”菜单启动Windows资源管理器,然后导航到ORACLE_HOME文件夹。 这通常是“Oracle”文件夹下的“Ora92”文件夹(即D:\Oracle\Ora92 )。

  3. 右键单击ORACLE_HOME文件夹,然后从下拉列表中选择“属性”选项。 应出现“属性”窗口。

  4. 单击“属性”窗口的“安全”选项卡。

  5. 单击“名称”列表中的“已validation用户”项(在Windows XP上,“名称”列表称为“组或用户名”)。

  6. 取消选中“允许”列下“权限”列表中的“读取和执行”框(在Windows XP上,“权限”列表称为“经过身份validation的用户的权限”)。

  7. 重新检查“允许”列下的“读取和执行”框(这是您刚取消选中的框)。

  8. 单击“高级”按钮,在“权限条目”列表中,确保您看到其中列出的“已validation用户”:

      Permission = Read & Execute Apply To = This folder, subfolders and files 

    如果不是这种情况,请编辑该行并确保“应用到”下拉框设置为“此文件夹,子文件夹和文件”。 这应该已经正确设置,但重要的是validation这一点。

  9. 单击“确定”按钮,直到关闭所有安全属性窗口。 光标可能会将小时玻璃显示几秒钟,因为它会将您刚刚更改的权限应用于所有子文件夹和文件。

  10. 重新启动计算机以确保这些更改已生效(重要)。

重新执行应用程序,它现在应该工作。

C的根是UAC不会让你写的地方之一。 有时,要求从受保护区域读取的未经证实的应用程序最终会从虚拟化等效文件中读取 – 而您的DLL将不会存在。 尝试将DLL移动到另一个文件夹(不是C的根目录,而不是程序文件下的任何内容),看看是否能解决它。 如果是,您可以将其留在那里或(更好)在您的应用上放置清单以防止虚拟化。

您是否尝试过使用程序集绑定日志查看器 ?

装配绑定日志查看器

不知道这是否可行,但您是否尝试使用regsrv32或Win7盒上的其他安装包注册MGW_SDK.DLL?

还试着找出MGW_SDK.DLL的依赖关系是否也可以在Win7机器上使用(在系统上或在你的应用程序文件夹中注册都可以)