关于C++通过函数指针调用C#类库DLL的问题

时间:2021-07-13 18:59:17
目前项目需要纯C语言调用C#的DLL,想了个笨方法,用C++调用C#的dll,在用C调用C++,问题出现在C++调用C#的时候,引用DLL文件没问题,但是指针找不到DLL的函数,.CPP代码如下:

#include "stdafx.h"
#include "windows.h"
 
typedef int ( * GetCuringReal)(int,int,int,int,int,double,double,double,double);
typedef int ( * CloseCuring)(int);
  
int main(int argc, char* argv[])
{
    HINSTANCE hDll;          //DLL句柄   
    GetCuringReal addFun;
    CloseCuring multfun;  //函数指针
     
    hDll = LoadLibrary("..\\Debug\\CuringLibrary.dll");//用此API函数加载DLL
    if (hDll != NULL)
    {
        addFun = (GetCuringReal)GetProcAddress(hDll,"GetCuringReal");//用此函数查找函数指针位置
        if(addFun!=NULL)
        {
            int result =  addFun(2,0,1,0,0,0,0,0,0);//调用此函数,
            printf("%d",result);
        }
        FreeLibrary(hDll);
    }   
    return 0;
}


以上在加载CuringLibrary.dll的时候 hDll = 0x00680000 { unused=9460301 } 
等到查找函数指针位置后, addFun = <未定义的值> 
求大神帮忙看看。是不是C#的dll生成时候还需要加什么设置吗?

9 个解决方案

#1


C#的dll导出函数名称不对,你用dependencies.exe 察看.

#2


不是很明白。我用C++直接引用
#using "..\debug\CuringLibrary.dll" 
using namespace CuringLibrary;
调用DLL的函数是没问题的,换成函数指针就不行了

#3


C#的DLL代码

using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Data;
using System.Data.SqlClient;

namespace CuringLibrary
{
    public class CuringData
    {
            public int GetCuringReal(int PoolNum, int CuringRunBit, int CuringUpBit
            , int CuringBWBit, int CuringDownBit, double AverageTemperature, double CoreTemperature
            , double SetTemperature, double Environment)
        {
            。。。。。。
            。。。。。。。
            return 0;
        }
}

#4


你这样用跟直接c语言用有什么区别?c++直接用是怎么用的?dll有个class的时候导出来的函数只是一个指针?是个带类型的吧。

#5


lz一个问题发了两遍啊。。。

C#的dll是不能用LoadLibrary加载使用的,看这个答案

http://bbs.csdn.net/topics/391812304#post-400287271

#6


另外,你这个C#的dll这样写在C++里用起来会很麻烦,你应该把 GetCuringReal 方法声明为 static,这样才能在 C++ 里用【类名.方法名】的形式来调用,不然你要先 new 一个 CuringData 对象出来才能调用得到那个方法。

#7


楼上正解~~~如果你这办法能调用c#类库了,那就可以直接用c来了。。。。
另外你这个c++层只是为了封装c#而已,干嘛非要用指针呢。
引用 2 楼 lyyailxj2 的回复:
不是很明白。我用C++直接引用
#using "..\debug\CuringLibrary.dll" 
using namespace CuringLibrary;
调用DLL的函数是没问题的,换成函数指针就不行了

#8


我是.NET开发,对于C和C++一窍不通。现在涉及到一个项目,甲方那边是成品软件,C写的,只能用函数指针。我又不懂C、C++,乱套了。。谁能给我个简单的实例啊?C语言--> C++ -->C#,

#1


C#的dll导出函数名称不对,你用dependencies.exe 察看.

#2


不是很明白。我用C++直接引用
#using "..\debug\CuringLibrary.dll" 
using namespace CuringLibrary;
调用DLL的函数是没问题的,换成函数指针就不行了

#3


C#的DLL代码

using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Data;
using System.Data.SqlClient;

namespace CuringLibrary
{
    public class CuringData
    {
            public int GetCuringReal(int PoolNum, int CuringRunBit, int CuringUpBit
            , int CuringBWBit, int CuringDownBit, double AverageTemperature, double CoreTemperature
            , double SetTemperature, double Environment)
        {
            。。。。。。
            。。。。。。。
            return 0;
        }
}

#4


你这样用跟直接c语言用有什么区别?c++直接用是怎么用的?dll有个class的时候导出来的函数只是一个指针?是个带类型的吧。

#5


lz一个问题发了两遍啊。。。

C#的dll是不能用LoadLibrary加载使用的,看这个答案

http://bbs.csdn.net/topics/391812304#post-400287271

#6


另外,你这个C#的dll这样写在C++里用起来会很麻烦,你应该把 GetCuringReal 方法声明为 static,这样才能在 C++ 里用【类名.方法名】的形式来调用,不然你要先 new 一个 CuringData 对象出来才能调用得到那个方法。

#7


楼上正解~~~如果你这办法能调用c#类库了,那就可以直接用c来了。。。。
另外你这个c++层只是为了封装c#而已,干嘛非要用指针呢。
引用 2 楼 lyyailxj2 的回复:
不是很明白。我用C++直接引用
#using "..\debug\CuringLibrary.dll" 
using namespace CuringLibrary;
调用DLL的函数是没问题的,换成函数指针就不行了

#8


我是.NET开发,对于C和C++一窍不通。现在涉及到一个项目,甲方那边是成品软件,C写的,只能用函数指针。我又不懂C、C++,乱套了。。谁能给我个简单的实例啊?C语言--> C++ -->C#,

#9