2009-05-20 82 views

回答

2

只要使用字符串,对于输入参数就可以正常工作,但您可以使用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,但是在实际调用函数之前,您需要知道字符串的大小。

3

如果参数是只读的,那么字符串应该可以工作,如果方法修改了字符串,您应该使用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

0

不知道这个工程,但你有没有试着用

StringObject.ToCharArray(); 

不确定从char * tho初始化字符串。 Mybe只是分配给一个字符串对象,值得一试。

0

你试过了StringBuilder吗?我发现这在谷歌搜索:

[DllImport("advapi32.dll")] 
public static extern bool GetUserName(StringBuilder lpBuffer, ref int nSize); 

如果你发布你正在做的电话,我们可以帮你组装。