日期:2014-05-18  浏览次数:20840 次

C#中导入C++生成的dll文件错误
 
 有一个C++程序,我要在C#项目中调用C++程序中的DLL文件,下面是我做过的一些操作:
 
 第一步:直接在.net中添加dll应用报错“找不到类型库”

 第二步:用DOS注册DLL文件 regsvr32 报错“找不到指定的模块”

 第三步:直接把DLL文件拷贝到windows/system32目录下,并且也拷贝到项目的bin目录中用,用代码

  [DllImport("LedCtrl.dll")] // LedCtrl.dll C++程序中的dll文件

  public static extern bool LSN_IsPower(); //LSN_IsPower c++程序中的一个方法

  调用,程序运行报错 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)

以上几种引用DLL文件的方法都试过了无效,请问大家有什么解决方案给个支持


写了一下代码用来打开DLL文件。。其它的DLL文件可以打开。。就是不能打开LedCtrl.dll

  ///<summary>
  /// API LoadLibrary
  ///</summary>
  [DllImport("Kernel32")]
  public static extern int LoadLibrary(String funcname);

  ///<summary>
  /// API GetProcAddress
  ///</summary>
  [DllImport("Kernel32")]
  public static extern int GetProcAddress(int handle, String funcname);

  ///<summary>
  /// API FreeLibrary
  ///</summary>
  [DllImport("Kernel32")]
  public static extern int FreeLibrary(int handle);




  这是C++中源码的调用DLL
  int dllint= LoadLibrary("LedCtrl.dll");
if (!dllint)
{
dllint= LoadLibrary("..\\LedCtrl.dll");
return false; 
}






大家帮忙看看。。用什么方式能够在C#中调用C++的DLL文件


谢谢!


------解决方案--------------------
用Depends工具分析一下,看C++ dll文件是否缺少一些依赖项?
------解决方案--------------------
把LedCtrl.dll文件拷贝到c#的debug和release目录(也就是你c#的exe文件所在目录)下试试看,
------解决方案--------------------
我也碰到过这种情况,问题正如一楼说的:缺少依赖项
解决办法是把跟dll有关的文件全部放在bin目录下 然后Import
------解决方案--------------------
原来的C++生成的Dll可能没有用extern声明,导致无法用DllImport这种方式引用
------解决方案--------------------
LZ,根据你的操作,发现几个问题:
1、“直接在.net中添加dll应用报错“找不到类型库””
C++的动态库不能直接添加到net工程里。
2、“用DOS注册DLL文件 regsvr32 报错“找不到指定的模块””
你些的是动态库,而非COM组件,所以不能注册。
3、“调用,程序运行报错 找不到指定的模块”
这类问题,一般是由于你的动态库,还依赖别的动态库,用VC的DEPENDS.EXE工具打开一看就能知道。
------解决方案--------------------
楼上的专业啊
------解决方案--------------------
7楼的专业,我记住了