5

我在尝试dll从我的应用程序中使用非托管代码时遇到了一些困难(用 C# 框架 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() :第 30 行Comtpaq.AdminPack.AdminPaqRepository.InitializeSDK()C:\Work\AgroIn\AdminPaqRepository.cs

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

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

MGW_SDK.dll开启(如c:\路径所示)

我已经安装了 C 运行时库

我还注意到一些有趣的东西:在异常上,开发路径正在显示C:\Work\AgroIn\AdminPaqRepository.cs:line 30

这里还有什么问题?

编辑

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

4

4 回答 4

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 
    

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

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

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

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

于 2010-10-07T08:52:06.560 回答
2

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

于 2010-09-29T12:04:27.083 回答
1

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

程序集绑定日志查看器

于 2010-09-29T04:25:48.877 回答
1

不知道这是否可以确定,但您是否尝试过在 Win7 机器上使用 regsrv32 或其他安装包注册 MGW_SDK.DLL?

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

于 2010-09-29T04:56:27.090 回答