使用其参数可以在 c# 中作为 out 参数调用的函数创建 C++ dll
Create C++ dll with functions whose arguments can be called as out parameter in c#
我想在 c++ 中创建一个函数,它接受两个参数 (char[], int) 并修改参数(类似于 c# 中的 out
参数),然后创建一个可以在中使用的 dll c#.
C++ 示例代码:
static void funct(char * name, int size)
{
char[] testName="John";
name=&testName;
size=5;
}
C# 示例代码:
const string dllLocation = "D:\Test.dll";
[DllImport(dllLocation, CallingConvention = CallingConvention.Cdecl)]
private static extern void funct(StringBuilder name, int size);
这不是正确的代码。这只是为了让我知道我想要什么。我想用c#通过dll访问c++函数并获取名称和大小(字符数)。
在 C++ 端使用指针并在 C# 端通过 ref 编组这些指针。
static void funct(char** name, int* size)
{
char[] testName="John";
*name=&testName;
*size=5;
}
const string dllLocation = "D:\Test.dll";
[DllImport(dllLocation, CallingConvention = CallingConvention.Cdecl)]
private static extern void funct(ref StringBuilder name, ref int size);
注意字符数组,它可能会造成内存泄漏或更糟的崩溃,如果有足够的空间,最好先测试缓冲区的大小和要传递给 C# 的数据的大小复制它,否则通知 C# 它需要更多大小,因此它由 C# 分配。
像这样:
static int funct(char** name, int* size, int bufferSize)
{
if(bufferSize < 4)
return 4;
char[] testName="John";
memcpy(name*, &char[0], 4);
*size=5;
return -1;
}
const string dllLocation = "D:\Test.dll";
[DllImport(dllLocation, CallingConvention = CallingConvention.Cdecl)]
private static extern void funct(ref StringBuilder name, ref int size, int bufferSize);
StringBuilder sb = null;
int size = 0;
//Request size
int neededSize = funct(ref sb, ref size, 0);
//Create buffer with appropiate size
sb = new StringBuilder(neededSize);
//Call with the correct size, test result.
if(funct(ref sb, ref size, neededSize) != -1)
throw new Exception();
我想在 c++ 中创建一个函数,它接受两个参数 (char[], int) 并修改参数(类似于 c# 中的 out
参数),然后创建一个可以在中使用的 dll c#.
C++ 示例代码:
static void funct(char * name, int size)
{
char[] testName="John";
name=&testName;
size=5;
}
C# 示例代码:
const string dllLocation = "D:\Test.dll";
[DllImport(dllLocation, CallingConvention = CallingConvention.Cdecl)]
private static extern void funct(StringBuilder name, int size);
这不是正确的代码。这只是为了让我知道我想要什么。我想用c#通过dll访问c++函数并获取名称和大小(字符数)。
在 C++ 端使用指针并在 C# 端通过 ref 编组这些指针。
static void funct(char** name, int* size)
{
char[] testName="John";
*name=&testName;
*size=5;
}
const string dllLocation = "D:\Test.dll";
[DllImport(dllLocation, CallingConvention = CallingConvention.Cdecl)]
private static extern void funct(ref StringBuilder name, ref int size);
注意字符数组,它可能会造成内存泄漏或更糟的崩溃,如果有足够的空间,最好先测试缓冲区的大小和要传递给 C# 的数据的大小复制它,否则通知 C# 它需要更多大小,因此它由 C# 分配。
像这样:
static int funct(char** name, int* size, int bufferSize)
{
if(bufferSize < 4)
return 4;
char[] testName="John";
memcpy(name*, &char[0], 4);
*size=5;
return -1;
}
const string dllLocation = "D:\Test.dll";
[DllImport(dllLocation, CallingConvention = CallingConvention.Cdecl)]
private static extern void funct(ref StringBuilder name, ref int size, int bufferSize);
StringBuilder sb = null;
int size = 0;
//Request size
int neededSize = funct(ref sb, ref size, 0);
//Create buffer with appropiate size
sb = new StringBuilder(neededSize);
//Call with the correct size, test result.
if(funct(ref sb, ref size, neededSize) != -1)
throw new Exception();