c#调用C、C++编写的dll

用c++编写了一个dll,现在要供c#调用,

在c++中调用的格式为:

typedef void (*CALLBACKF) (char **, int, double, char **);

typedef bool (*FUN)(char *, double , double , double , CALLBACKF, int);

dll=LoadLibrary(dllLocation);
FUN fun1=(FUN)GetProcAddress(dll, "fun");

在c#中如何实现?谢谢~
我需要的是如何输入输出 数组,题中的是char数组,包括一维和多维,我是这样写的

c中的callback在c#中如何实现?

第1个回答  2008-07-22
此示例使用 C 程序创建一个 DLL,在下一示例中将从 C# 程序调用该 DLL。
// cmdll.c
// compile with: /LD
int __declspec(dllexport) SampleMethod(int i)
{
return i*10;
}

该示例使用两个文件 CM.cs 和 Cmdll.c 来说明 extern。C 文件是示例 2 中创建的外部 DLL,它从 C# 程序内调用。
// cm.cs
using System;
using System.Runtime.InteropServices;
public class MainClass
{
[DllImport("Cmdll.dll")]
public static extern int SampleMethod(int x);

static void Main()
{
Console.WriteLine("SampleMethod() returns {0}.", SampleMethod(5));
}
}

参考资料:MSDN

第2个回答  2008-07-22
将该DLL文件复制到C#的BIN下面就可以了撒
第3个回答  2008-07-22
回调函数我用过,

定义这个typedef void (*CALLBACKF) (char **, int, double, char **);
回调函数
using System.Runtime.InteropServices;
class API
{
[UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]
//上面这个可能不要 可能要,具体看你这个回调函数的调用方式是cdecl调用还是其他。
public delegate void ChCallback(参数自己一一对应);

[DllImport("Cmdll.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern bool FUN(char *, double , double , double ,ChCallback CallBack,int );
参数自己对应写,我的意思是自己定义一个delegate 对应C++ 中的CALLBACKF 然后再放到 fun参数里

}
然后其他类里实例api这个类后
pcallback = new API.ChCallback(MTEvent);
MTEvent为事件处理函数 意思就是typedef void (*CALLBACKF) (char **, int, double, char **);
这个在C#的具体回调实例!
public MTEvent(char **, int, double, char **)'

char 数组用 string接受

char *,这样定义

int len=128;
IntPtr cha = Marshal.AllocHGlobal(len);
len中间的len你自己看分配多少内存!cha 这就是一个指针。就是指向你分配的一块内存,然后把这个指针传递进去!本回答被提问者采纳

c#调用C、C++编写的dll
此示例使用 C 程序创建一个 DLL,在下一示例中将从 C# 程序调用该 DLL。\/\/ cmdll.c \/\/ compile with: \/LD int __declspec(dllexport) SampleMethod(int i){ return i*10;} 该示例使用两个文件 CM.cs 和 Cmdll.c 来说明 extern。C 文件是示例 2 中创建的外部 DLL,它从 C# 程序内调用...

C#调用C++生成的DLL文件会影响C++程序的执行效率吗??
c#走的是.net体系托管程序,c++的dll动态库更为直接,c#调用c++写的dll不失为提高效率的做法。但有认为应该尽量减少调用的次数,可以在c++动态库中完成较大工作量的工作,减少互相的通信和反复数据交换,因此把工作量较大和运算时间和逻辑复杂的封装在dll内部,将结果以简单的形式返回到调用的c#中,这样...

C#调用C++生成的DLL文件会影响C++程序的执行效率吗?
你好!c#走的是.net体系托管程序,c++的dll动态库更为直接,c#调用c++写的dll不失为提高效率的做法。但个人认为应该尽量减少调用的次数,可以在c++动态库中完成较大工作量的工作,减少互相的通信和反复数据交换,因此把工作量较大和运算时间和逻辑复杂的封装在dll内部,将结果以简单的形式返回到调用的c#...

如何在C#中调试C++写的DLL代码
1.将DLL源码工程项目加入目前用到的C#工程的解决方案中。2.设置DLL工程的生成模式为Debug,Debug模式下会生成pdb调试文件。3.设置C#工程的生成模式为Debug,否则无法命中DLL源码中的断点。4.由于DLL工程是独立的,所以将DLL工程生成的dll文件以及pdb文件拷入C#工程的Debug输出目录下。5.设置断点,开始调试。

如何在C#中调用C\/C++ DLL中的方法
Visual Studio 2005 中的本机 Visual C++ 代码中调用托管的 DLL\/\/ http:\/\/support.microsoft.com\/kb\/828736四、总结:1)用C#写任何的类库2)C++ 中要引用此类库3)创建C#对象时要用gcnew ;4) C++ 编译设置一定设置为:支持公共语言运行时支持(\/clr)4) 自身的C++类要用 ref class 定义。

c#dll调用c++dll,得到c#dll文件名
例如,假设我们有一个C++ DLL文件名为MyCppDll.dll,其中包含一个名为MyFunction的函数,它接受一个整数参数并返回一个整数结果。我们可以在C#中使用以下代码来调用该函数:using System.Runtime.InteropServices;class MyClass{ [DllImport("MyCppDll.dll")] public static extern int MyFunction(int...

C#如何调用C++的DLL的结构体数组指针
1、添加引用 右击项目-添加引用-浏览 找到本地的dll文件 2、using 该dll文件里面代码的名称空间 然后就可以调用dll文件里面的类(test)和方法(add)了 例如:using aa.test namespace conslole1 { class Program { static void Main(string[] args){ Test test1=new Test();test1.add(1, 2);}...

c#调用C++写的DLL,DLL中的接口参数有二维数组(如:foat**),在c#中...
综上所述,C#不能直接调用Test(float** arr,int rows,int cols),你必须使用非安全代码构造一个single*[],然后将这个数组传递过去。下面是一个例子 [DllImport("test.dll")]static extern unsafe bool Test(float*[] arr, int row, int col);\/\/这里arr要声明为float*[],使用起来比较方便 bool...

c#调用C++写的DLL,DLL中的接口参数有二维数组(如:char**),在c#中...
我没有发现有什么问题,使用[DllImpor[("你需要引用的DLL")] private static extern 返回类型 需要引用的接口函数(你要用到的数组)。既然是C++写的DLL,那么应该有针对这个数组的方法的,就象C#中的get和set。它与C#这种不同的,即使它在DLL中被声明成全局参数也不无法在C#中直接被导入引用的。

请教C#调用C++\/CLR中生成dll,类型转换有关问题
参数可以直接使用Native C++类类型,但是C#无法理解这些参数 也就是说,public函数不要用Native C++类类型作为参数类型 你要是进行基本类型转换,将Native类型转成CLR类型(C#可直接使用的类型),可以参考MSDN Overview of Marshaling in C++ https:\/\/msdn.microsoft.com\/en-us\/library\/bb384865.aspx ...

相似回答