DllImport生成System.DllNotFoundException

Bon*_*arp 5 c# dllnotfoundexception dllimport

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

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

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

System.DllNotFoundException:无法加载DLL ' C:\MGW_SDK.dll':找不到指定的模块.于:(0x8007007E从HRESULT异常)Comtpaq.AdminPack.SDKWrapper.fInicializaSDK()Comtpaq.AdminPack.AdminPaqRepository.InitializeSDK()C:\Work\AgroIn\AdminPaqRepository.cs:第30行

我已经运行了Dependency Walker,它将以下依赖关系显示为冲突:C:\windows\system32\SHLWAPI.DLL

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

MGW_SDK.dllc:\(作为路径说)

我已经安装了C运行时库

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

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

编辑

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

Bon*_*arp 6

嗯,这是一个非常棘手的问题.它与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. 单击"名称"列表中的"经过身份验证的用户"项(在Windows XP上,"名称"列表称为"组或用户名").

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

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

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

      Permission = Read & Execute 
      Apply To = This folder, subfolders and files 
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 提供的链接现已中断. (11认同)