在C#项目中调用C++生成的dll相关参数定义调用
C++声明的如下
- 形参有
char *
、const char *
、int
- 返回类型有
char *
、int
extern "C" {
#endif
#if defined(_WIN32)
# define __export __declspec(dllexport)
#elif defined(__GNUC__) && ((__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3))
# define __export __attribute__((visibility("default")))
#else
# define __export
#endif
__export char * test1(int length, const char * param);
__export int test2(char * cResult);
#ifdef __cplusplus
}
#endif
C#中调用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace demo
{
using System.Runtime.InteropServices;
class Program
{
[DllImport("hello", EntryPoint = "test1", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr test1(int length, string param);
[DllImport("hello", EntryPoint = "test2", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int test2(IntPtr result);
static void Main(string[] args)
{
string param = "小路人";
int length = 6;
IntPtr ipName = test1(length,param);
string ResName = Marshal.PtrToStringAnsi(ipName);
Console.WriteLine("test1\t" + ResName);
IntPtr ipName2 = Marshal.AllocHGlobal(256); ;
int rv = test2(ipName2);
ResName = Marshal.PtrToStringAnsi(ipName2);
Console.WriteLine("test2\t" + ResName);
Console.ReadKey();
}
}
}
示例程序
总结
C++ | C# | 释义 |
---|---|---|
int | int | 整型 数字 |
char * | IntPtr | 字符指针 |
const char * | string | 字符串 |
IntPtr
转换为string
–>调用Marshal.PtrToStringAnsi()