Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DllImport生成System.DllNotFoundException_C#_Dllimport_Dllnotfoundexception - Fatal编程技术网

C# DllImport生成System.DllNotFoundException

C# DllImport生成System.DllNotFoundException,c#,dllimport,dllnotfoundexception,C#,Dllimport,Dllnotfoundexception,当我试图从我的应用程序(用C#framework 4.0编写)中使用非托管代码dll时,遇到了一些困难。 我正在使用dll导入,如下所示 [DllImport(@"C:\MGW_SDK.dll", EntryPoint = "fInicializaSDK")] public static extern int fInicializaSDK(); 奇怪的是,当从我的开发环境(Windows XP)调用时,它工作正常,但在生产服务器(Windows 7)上时,它会生成以下异常: System.Dl

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

[DllImport(@"C:\MGW_SDK.dll", EntryPoint = "fInicializaSDK")]
public static extern int fInicializaSDK();
奇怪的是,当从我的开发环境(Windows XP)调用时,它工作正常,但在生产服务器(Windows 7)上时,它会生成以下异常:

System.DllNotFoundException
:无法加载DLL
“C:\MGW_SDK.DLL”
:找不到指定的模块。(HRESULT:0x8007007E的例外)位于
Comtpaq.AdminPack.SDKWrapper.fInicializaSDK()
位于
Comtpaq.AdminPack.AdminPaqRepository.InitializeSDK()
中的
C:\Work\AgroIn\AdminPaqRepository.cs
:第30行

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

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

MGW\u SDK.dll
位于
c:\
上(如路径所示)

我已经安装了C运行库

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

这里还有什么问题

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

您尝试过使用吗


不知道这是否确实有效,但您是否尝试过在Win7 box上使用regsrv32或其他安装包注册MGW_SDK.DLL


另外,请尝试找出MGW_SDK.DLL的依赖项是否在Win7计算机上也可用(在系统上注册或在应用程序文件夹中注册都可以)

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

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

基本上,这个问题可以通过删除并重新添加DLL所在文件夹上的execute权限来解决。请参阅(回程机器)

解决方案
Oracle 9.2客户端软件要求您提供经过身份验证的 通过以下步骤,用户可以获得Oracle主页的权限:

  • 以具有管理员权限的用户身份登录到Windows

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

  • 右键单击ORACLE_主文件夹并从下拉列表中选择“属性”选项。应出现“属性”窗口

  • 单击“属性”窗口的“安全”选项卡

  • 单击“名称”列表中的“已验证用户”项(在Windows XP中,“名称”列表称为“组或用户名”)

  • 取消选中“允许”列下“权限”列表中的“读取和执行”框(在Windows XP中,“权限”列表称为“已验证用户的权限”)

  • 重新选中“允许”列下的“读取并执行”框(这是您刚才未选中的框)

  • 单击“高级”按钮,并在“权限条目”列表中确保您看到其中列出的“已验证用户”,包括:

      Permission = Read & Execute 
      Apply To = This folder, subfolders and files 
    
    如果不是这样,请编辑该行,并确保“应用到”下拉框设置为“此文件夹、子文件夹和文件”。这应该已经正确设置,但您必须验证这一点

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

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

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


    生产操作系统和开发操作系统都是32位的。NET应用程序是为AnyCPU目标平台编译的?是的,两个操作系统都是32位的,它们被编译为AnyCPU,应用程序本身工作,就是这个组件让我感到痛苦。它是什么类型的应用程序?桌面,ASP.NET?这实际上是一个WCF服务。您是否尝试将所有必需的DLL放入应用程序文件夹中?只是为了确保它能找到它们。这对DllImport/PInvoke库有用吗?看起来它仅适用于CLI程序集。无法确定。我在谷歌上搜索了一下,但没有找到任何条目指定P/Invoke库是否有效。我认为值得一试。我在我有服务的地方运行它,但没有显示任何信息,但是当我在客户机上运行它时,它会显示进程。。。它是否需要一个窗口才能登录?WCFs如何?我尝试使用regsvr32注册dll,但它不起作用。模块“MGW_SDK.dll”无法加载。请确保二进制文件存储在指定的路径上,或对其进行调试。请检查二进制文件或依赖的.dll文件是否存在问题。找不到指定的过程。我在这里看到的唯一失败的依赖项(依赖项walker)是SHLWAP