DllImport生成System.DllNotFoundException

时间:2010-09-29 03:11:03

标签: c# dllimport dllnotfoundexception

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

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

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

  

System.DllNotFoundException:无法加载DLL ' C:\MGW_SDK.dll':找不到指定的模块。 (HRESULT异常:0x8007007E)Comtpaq.AdminPack.SDKWrapper.fInicializaSDK()位于Comtpaq.AdminPack.AdminPaqRepository.InitializeSDK()的{​​{1}}:第30行

我已经运行Dependency Walker,其中显示以下依赖项已冲突:C:\Work\AgroIn\AdminPaqRepository.cs

我已经尝试将C:\windows\system32\SHLWAPI.DLL复制到我的部署目录

dllMGW_SDK.dll上(如路径所示)

我已经安装了C运行时库

我还注意到一些有趣的东西:在例外情况下,开发路径显示c:\

这里还有什么问题?

修改

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

4 个答案:

答案 0 :(得分:6)

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

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

  

解决方案

     
     

Oracle 9.2客户端软件要求您提供Authenticated   遵循以下步骤对Oracle Home的用户权限:

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

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

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

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

  8.   
  9. 单击“名称”列表中的“经过身份验证的用户”项(在Windows XP上,“名称”列表称为“组或用户名”)。

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

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

  14.   
  15. 点击“高级”按钮,在“权限条目”列表中,确保您看到“认证用户”列出:

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

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

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

  18.   
  19. 重新启动计算机以确保已执行这些更改   效果(重要)。

  20.         

    重新执行该应用程序,现在应该可以正常运行。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

您是否尝试过使用Assembly Binding Log Viewer

Assembly Binding Log Viewer

答案 3 :(得分:1)

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

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