0%

C#调用C++方法,C#使用c++方法返回类或结构体。

1. 在c++中定义结构体,类,处理方法;要给c#调用的方法要加extern “C” __declspec(dllexport) 修饰

#include "stdafx.h"

#define EXPORT_DLL extern "C" __declspec(dllexport)

EXPORT_DLL int Add(``int a,``int b)

{

return a + b;

}

struct Bar

{

public :

int id;

char``* name;

};

EXPORT_DLL void GetBar(Bar& bar)

{

bar.id = 10;

bar.name = "hi bar 中文了"``;

}

class Foo

{

public :

int id;

char``* name;

};

EXPORT_DLL void GetFoo(Foo& foo)

{

foo.id = 100;

foo.name = "I'm 傻瓜"``;

}

2. 在C#中使用C++方法,首先需要定义C++中的Foo(在c++中定义为类class),Bar(在C++中定义为struct)对应的数据结构struct;然后定义extern的方法,如下代码所示:

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

namespace UseCppDll

{

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]

public struct Bar

{

/// int

public int id;

/// char*

[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)]

public string name;

}

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]

public struct Foo

{

/// int

public int id;

/// char*

[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)]

public string name;

}

class Program

{

[DllImport(``"CppDll.dll"``,EntryPoint=``"Add"``)]

extern static int Add(``int a, int b);

[DllImport(``"CppDll.dll"``, EntryPoint = "GetBar"``,CharSet=CharSet.Ansi)]

extern static void GetBar(``ref Bar bar);

[DllImport(``"CppDll.dll"``, EntryPoint = "GetFoo"``, CharSet = CharSet.Ansi)]

extern static void GetFoo(``ref Foo foo);

static void Main(``string``[] args)

{

Console.WriteLine(Add(5,4));

Bar b = new Bar();

GetBar(``ref b);

Console.WriteLine(``"b's id is " + b.id);

Console.WriteLine(``"b's name is " + b.name);

Foo f = new Foo();

GetFoo(``ref f);

Console.WriteLine(``"f's id is " + f.id);

Console.WriteLine(``"f's name is " + f.name);

Console.Read();

}

}

}

C++中的类或者结构在C#中的定义代码可以使用微软提供的工具(P/Invoke Interop Assistant)生成。

在运行C#程序前要把C++dll复制到C#程序运行目录下。