C#换机器后调用dll失败提示无法加载DLL找不到指定的模块

来源:互联网 发布:网络思想政治教育效果 编辑:程序博客网 时间:2024/04/29 06:37

        用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放到同一目录下,运行成功。





1 0
原创粉丝点击