用C#写了一个软件,并且用C++写的核心算法封装成了dll,在安装了VS2010的机器上开发完成后一切正常。但是当把.exe和dll拷贝到另外没安装vs2010的机器上后,运行.exe就会报如下错误,调用dll失败提示无法加载DLL找不到指定的模块:
一开始以为是dll没写好,找不到入口,但是回到C++程序中检查,所有对外的函数都是加了
extern "C" __declspec(dllexport) 关键字的,没有问题。
在C#中使用非托管的调用方式,C#中调用代码如下:
public class CPPDLL
{
[DllImport("HDLC.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern int hdlc_encode(byte[] pOut, byte[] pIn, uint inLen, uint maxOutLen);
[DllImport("HDLC.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern int hdlc_decode(byte[] pOut, byte[] pIn, ref uint inLen, uint maxOutLen);
//[DllImport("HDLC.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
//public static extern void test(byte[] pOut, byte[] pIn, uint inLen);
}
这样是没问题的。
经过仔细分析,认为应该是新机器上缺少一些东西导致。于是使用Depends软件,在新机器上打开自己写的dll,发现果然报错:
左侧窗口中显示该dll还要依赖MSVCR100D.DLL和KERNEL32.DLL两个系统DLL,在新机器上缺少的是MSVCR100D.DLL文件。
于是到开发机上搜索该文件,在系统目录和VS2010目录下找到好几个,应该是安装VS2010的时候给安装上的,于是随便复制一个小点的MSVCR100D.DLL到新机器上,跟.exe放到同一目录下,运行成功。