各位,我用vc编写的一个简单的dll,如下:
extern "C" _declspec(dllexport) int Add(int a,int b)
{
     AFX_MANAGE_STATE(AfxGetStaticModuleState());
     TRACE("Entering DllAdd\n");
     return a+b;
}
编译生成MFCDllTest.dll,可是在C#中调用出现问题:
[DllImport("MFCDllTest.dll", EntryPoint = "Add", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Add(int a, int b);
int t = Add(5,10);无法加载 DLL“MFCDllTest.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。不知问题出现在哪里?我已经将MFCDllTest.dll放在bin目录和system32下,还是不行,求解决方法!

解决方案 »

  1.   

    无法访问MFCDLLTEST.DLL的问题.. 你的程序是WEBFORM?
      

  2.   

    MFCDllTest.dll放在System32目录下或者放在你程序同一个目录下
      

  3.   

    多谢各位关注!各个目录(system32,bin等)都放过了,结果都一样我的程序是普通的WINForm
      

  4.   

    引用: using System.Runtime.InteropServices;
            [DllImport("Kernel32")]                    //读取动态库文件
            public static extern int GetProcAddress(int handle, String funcname);
            [DllImport("Kernel32")]
            public static extern int LoadLibrary(String funcname);
            [DllImport("Kernel32")]
            public static extern int FreeLibrary(int handle);
            [DllImport("HmPark.dll")]                  //声明C++中的接口函数,  其中 HmPark 为你的动态库文件名
            public static extern double GetStdCharge(UInt32 time_In, UInt32 time_Out);        private int huser32 = 0;
            private void CountCharge()
            {
        double dCharge = 0;
                try
                {
                    huser32 = LoadLibrary("HmPark.dll");        //载入动态库
                    dCharge = GetStdCharge(time_In, time_Out); //调用 C++ 中的接口函数
                }
                catch (Exception ex)
                {
                    MessageBox.Show("调用出错: " + ex.Message, "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                finally
                {
                    try
                    {
                        Inspect.FreeLibrary(huser32);                          //释放动态库文件, 否则会弹出异常
                    }
                    catch (Exception ee)
                    {
                        MessageBox.Show("释放出错: " + ee.Message, "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }另: 注意你 VC程序中的 Add 函数是否有导出。
      

  5.   

    按照你的办法,还是不行,依然报同样的错误我专门用vc试了一下调用同样的dll函数,结果是正常的困惑中
      

  6.   

    我已经将MFCDllTest.dll放在bin目录和system32下,还是不行,求解决方法!
    你是放在 bin 目录下的么? 应该是放在 bin 的 debug 或 release 目录下吧?
      

  7.   

    1.DLL放在和exe同级目录下;
    2.看看你的DLL是不是还要依赖其他的dll,depends可以看.
    3.可能性较小,你的C#声明处显示指明调用协议是cdecl,你的C++项目的默认调用协议是不是设成stdcall或者其他的了
    暂时能想到的就这么多了.
      

  8.   


    为了测试,我分别都放了一个(bin 和bin 下的debug 目录下)
      

  9.   

    我在c++代码中的定义应该是你说的cdecl协议吧,代码如下
    extern "C" _declspec(dllexport) int Add(int a,int b) 

        AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
        TRACE("Entering DllAdd\n"); 
        return a+b; 
    } 而且我的DLL中只有这一个简单的函数,应该不会依赖其他的dll了。
      

  10.   

    各位,问题解决了,感谢happyyst的提醒,原因是我用其他机器上的vc编写的dll,现在换到另外的一台安装vs2008的机器上,需要一些类库的支持,分别是MSVCRTD.DLL,MFC42D.DLL,MFC042D.DLL,将上述三个dll拷贝至debug目录下问题解决。
    再次感谢各位关注,结贴了。