C#无法加载 DLL 找不到指定的模块 (转)

一个dll组件不能调用导致异常,在网络上搜索发现三个版本的解决方案:

方案一

将XXXX.dll(提示找不到的组件)拷贝到项目文件夹中bin目录下

方案二

把XXXX.dll(提示找不到的组件)拷贝到system32目录下

方案三

====================================原文===========================================

最近继续用ASP.Net来重新开发ACM的Online Judge系统,因为要进行进程的监控,所以自己编写了一个非托管的DLL供ASP.Net调用。
我用的是VS2005的开发环境,后来发现使用[DllImport("Judge.dll")]后提示 无法加载 DLL “Judge.dll”  找不到指定的模块
我这时是把Judge.dll拷贝到Bin目录下的,但仍然提示找不到DLL,在工程里添加DLL引用的时候,发现添加这个非托管DLL就会令VS2005异常退出(上网搜索后也发现有人有相同的问题)
后来发现用[DllImport(@"C:/OJ/Bin/Judge.dll")]
这样指定DLL的绝对路径就可以正常装载。
这里还有一个解决办法.Net/thread/1121085.aspx">http://forums.asp.Net/thread/1121085.aspx
这个问题最常出现在使用第三方非托管DLL组件的时候,我的也同样是这时出的问题,Asp.Net Team的官方解决方案如下:

先需要确认你引用了哪些组件,那些是托管的,哪些是非托管的.托管的很好办,直接被使用的需要引用,间接使用的需要拷贝到bin目录下.非托管的处理会比
较麻烦.实际上,你拷贝到bin没有任何帮助,因为CLR会把文件拷贝到一个临时目录下,然后在那运行web,而CLR只会拷贝托管文件,这就是为什么我
们明明把非托管的dll放在了bin下却依然提示不能加载模块了.
具体做法如下:
首先我们在服务器上随便找个地方新建一个目录,假如为C:/DLL
然后,在环境变量中,给Path变量添加这个目录
最后,把所有的非托管文件都拷贝到C:/DLL中.
或者更干脆的把DLL放到system32目录
对于可以自己部署的应用程序,这样未偿不是一个解决办法,然而,如果我们用的是虚拟空间,我们是没办法把注册PATH变量或者把我们自己的DLL拷到system32目录的。同时我们也不一定知道我们的Dll的物理路径
DllImport里面只能用字符串常量,而不能够用Server.MapPath(@"~/Bin/Judge.dll")来确定物理路径。
经过一翻研究,终于想到了一个完美的解决办法
首先我们用
 [DllImport("kernel32.dll")]
 private extern static IntPtr LoadLibrary(String path);
 [DllImport("kernel32.dll")]
 private extern static IntPtr GetProcAddress(IntPtr lib, String funcName);
 [DllImport("kernel32.dll")]
 private extern static bool FreeLibrary(IntPtr lib);
分别取得了LoadLibrary和GetProcAddress函数的地址,再通过这两个函数来取得我们的DLL里面的函数。
我们可以先用Server.MapPath(@"~/Bin/Judge.dll")来取得我们的DLL的物理路径,然后再用LoadLibrary进行载入,最后用GetProcAddress取得要用的函数地址
以下自定义类的代码完成LoadLibrary的装载和函数调用:
public class DllInvoke
    {
        
        [DllImport("kernel32.dll")]
        private extern static IntPtr LoadLibrary(String path);
        [DllImport("kernel32.dll")]
        private extern static IntPtr GetProcAddress(IntPtr lib, String funcName);
        [DllImport("kernel32.dll")]
        private extern static bool FreeLibrary(IntPtr lib);
        private IntPtr hLib;
        public DllInvoke(String DLLPath)
        {
            hLib = LoadLibrary(DLLPath);
        }
        ~DllInvoke()
        {
            FreeLibrary(hLib);            
        }
        //将要执行的函数转换为委托
        public Delegate Invoke(String APIName,Type t)  
        {
            IntPtr api = GetProcAddress(hLib, APIName);
            return (Delegate)Marshal.GetDelegateForFunctionPointer(api,t);
        }
}

下面代码进行调用
 public delegate int Compile(String command, StringBuilder inf);//编译
DllInvoke dll = new DllInvoke(Server.MapPath(@"~/Bin/Judge.dll"));
Compile compile = (Compile)dll.Invoke("Compile", typeof(Compile));
StringBuilder inf;
compile(@“gcc a.c -o a.exe“,inf); //这里就是调用我的DLL里定义的Compile函数

-------------------------------------------------------------------------------------------------------------------

时间: 2024-12-08 13:20:33

C#无法加载 DLL 找不到指定的模块 (转)的相关文章

c# 无法加载xxx.dll 找不到指定的模块(如何指定文件夹)

如果直接放在项目运行目录,例如bin/debug可以直接加载,但是这样比较乱. 如果在放debug里面的一个文件夹里面,有可能会报错“无法加载xxx.dll 找不到指定的模块”. 如果路径写成这样就会报错 framework/linphone 解决方法:将/ 改成"\" framework\linphone

无法加载 DLL“ArcGISVersion.dll”: 找不到指定的模块

无法加载 DLL“ArcGISVersion.dll”: 找不到指定的模块.(异常来自 HRESULT:0x8007007E). 解决方案:在项目属性-生成-目标平台改为x86就好了. 另外,千万别忘了在项目Program的Main函数中添加下一行代码. ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);

无法加载 DLL“ParkCOM.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E) 终结者

C#调用利用C++写的dll 常遇到的情况是无法加载DLL"***.dll":找不到指定的模块(异常来自HRESULT:0x8007007E)终极解决方法如下: 1.产生原因 可能存在 老版本程序正常,在新的版本中调用异常问题,可能本地电脑系统缺乏相关的支持DLL 2.要解决此方法 就是用工具软件终极杀手锏,下载安装depend walk查看依赖关系,看你的dll到底还调用了那些dll, 至于depend显示的IESHIMS.DLL,比如: 这些才是至关重要的却是信息,然后通过这些提示

使用c#封装海康SDK出现无法加载 DLL“..\bin\HCNetSDK.dll”: 找不到指定的模块

最近在研究网络摄像头的二次开发,测试了一款海康威视的网络摄像头,程序调试的时候,出现如题的报错. 调试随机自带的demo时,程序运行正常,但当把该程序引入到我自己的程序中时,就开始报错.根据开发软件包的提示,将调试所需的DLL文件拷贝到bin文件下,仍然报错. 根据错误提示"无法加载DLL"..\bin\HCNetSDK.dll":找不到指定的模块"信息,找到报错内容的定义处,发现为DLL文件引用. 与报错信息相同的为导入DLL文件的路径,即程序在该路径下无法找到所

[解决异常] 未经处理的异常 "无法加载 DLL“lib/xxx.dll”: 找不到指定的模块"

1.异常描述: 运行后报错: System.DllNotFoundException:“无法加载 DLL“lib/xxx.dll”: 找不到指定的模块. (异常来自 HRESULT:0x8007007E).” 路径检查写正确了的情况下 2.问题原因: 未能复制到bin目录下,即运行时没有复制到输出目录,因此找不到 3.解决方法: 右键属性||选中>视图>属性窗口; 设为始终复制; 原文地址:https://www.cnblogs.com/xm1998/p/12179176.html

解决 Unable to load DLL 'OraOps9.dll': 找不到指定的模块。 (Exception from HRESULT: 0x8007007E)

这个问题网上的答案是把oracle的home文件夹权限变为完全控制,然而并没有好用,还有一种方法是在编写的程序的config文件加入 <runtime> <legacyCorruptedStateExceptionsPolicy enabled="true"/> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly>

关于无法加载DLL&quot;***.dll&quot;:找不到指定的模块(异常来自HRESULT:0x8007007E)问题的解决办法

最近在编写C#代码的过程中,遇到此问题,网上查找资料后,终于解决了此问题.现将解决方法记录下来,以便以后查看.注:此方法未必能解决所有这类问题,仅供参考. 通常在以下情况下会出现这种异常: (1)想要在64的系统上运行32位的应用程序并且没有WOW64(Windows-on-Windows 64-bit)子系统的存在. (2)在编写运行在64位操作系统平台的应用程序时,调用DLL并且此DLL也是在64位操作平台下生成的,此时将有可能出现这类问题(我所遇到的情况). 解决方法: 方法1:找到这个无

无法加载 DLL“SQLite.Interop.DLL”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。

在使用sqlite数据库的时候遇到的,这里做个总结: 在项目里添加  现有项  把SQLite.Interop.DLL文件添加进来,然后点击属性  修改一个属性 把 属性 复制到输出目录 改为  始终复制 然后打开你的项目属性 进入生成的 页面,把目标改为 x86 或者 x64 选择你自己的: 然后运行就可以了:

asp.net调用非托管dll,无法加载 DLL,找不到指定模块解决方法。

最近开发一个项目,里面用到了非.net开发的一个dll文件接口,发现发布到window2003服务器上后,运行网站总是提示 "无法加载 DLL"D:\11\1.dll": 找不到指定的模块. (异常来自 HRESULT:0x8007007E). "这个错误.但是我在本地xp系统上调试是可以的. dll使用com调用如下 [DllImport(@"D:\11\1.dll", EntryPoint = "aaa", CharSet