我有一个C++的dll,我需要从C#调用。 dll中的一个函数需要char *作为输入参数,另一个函数使用char *作为输出参数。使用C#中的char *参数调用DLL函数?
什么是从C#调用这些的正确方法?
我有一个C++的dll,我需要从C#调用。 dll中的一个函数需要char *作为输入参数,另一个函数使用char *作为输出参数。使用C#中的char *参数调用DLL函数?
什么是从C#调用这些的正确方法?
只要使用字符串,对于输入参数就可以正常工作,但您可以使用MarshalAs属性控制字符串的详细信息。例如。
[DllImport("somedll.dll", CharSet = CharSet.Unicode)]
static extern void Func([MarshalAs(UnmanagedType.LPWStr)] string wideString);
至于返回char *参数,由于涉及对象所有权,所以这会更复杂一点。如果你可以改变C++ DLL,您可以使用CoTaskMemAllocate,喜欢的东西:
void OutputString(char*& output)
{
char* toCopy = "hello...";
size_t bufferSize = strlen(toCopy);
LPVOID mem = CoTaskMemAlloc(bufferSize);
memcpy(mem, toCopy, bufferSize);
output = static_cast<char*>(mem);
}
的C#侧然后只使用一种“串出”参数,垃圾收集器可以拿起字符串的所有权。
这样做的另一种方法是使用StringBuilder,但是在实际调用函数之前,您需要知道字符串的大小。
如果参数是只读的,那么字符串应该可以工作,如果方法修改了字符串,您应该使用StringBuilder来代替。从下面参考
例子:
[DllImport ("libc.so")]
private static extern void strncpy (StringBuilder dest,
string src, uint n);
private static void UseStrncpy()
{
StringBuilder sb = new StringBuilder (256);
strncpy (sb, "this is the source string", sb.Capacity);
Console.WriteLine (sb.ToString());
}
如果你不知道怎么的P/Invoke编组的作品,你可以阅读http://www.mono-project.com/Interop_with_Native_Libraries
如果你只用绳子conserning,只读部分:http://www.mono-project.com/Interop_with_Native_Libraries#Strings
不知道这个工程,但你有没有试着用
StringObject.ToCharArray();
不确定从char * tho初始化字符串。 Mybe只是分配给一个字符串对象,值得一试。
你试过了StringBuilder吗?我发现这在谷歌搜索:
[DllImport("advapi32.dll")]
public static extern bool GetUserName(StringBuilder lpBuffer, ref int nSize);
如果你发布你正在做的电话,我们可以帮你组装。