我是C#和封送的新手。我需要在C#中使用我的C函數,但是我從C func返回的值不正確(或者我不知道如何將它轉換爲正確的答案)。DllImport和char Marshaling
c來源:
#include "main.h"
char *Ololo(char *arg, int &n3)
{
char *szRet;
szRet=(char*)malloc(strlen(arg)+1);
strcpy(szRet,arg);
n3 = strlen(szRet);
return szRet;
}
C頭:
extern "C" __declspec(dllexport) char *Ololo(char *arg, int &n3);
C#源: 「伯仲」
class Program
{
[DllImport(@"F:\Projects\service\dll\testDLL2.DLL", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
public static extern IntPtr Ololo([In] char[] arg, ref Int32 n3);
static void Main(string[] args)
{
string n1 = "ololo";
char[] chars = new char[n1.Length];
chars = n1.ToCharArray();
Int32 n3 = 0;
IntPtr result;
result = Ololo(chars, ref n3);
string n4 = Marshal.PtrToStringUni(result,n3);
Console.WriteLine(n4);
}
}
我已經得到了一些回報,像
對不起,我英文不好
----------------------解決--------------- --------
class Program
{
[DllImport(@"F:\Projects\service\dll\testDLL2.DLL", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
public static extern IntPtr Ololo([MarshalAs(UnmanagedType.LPStr)]string arg, ref Int32 n3);
static void Main(string[] args)
{
string n1 = "ololo";
Int32 n3 = 0;
int n2 = n1.Length;
IntPtr result;
result = Ololo(n1, ref n3);
string n4 = Marshal.PtrToStringAnsi(result, n3);
Console.WriteLine(n4);
}
}
工作正常。在n3中,我得到了5和n4奧洛洛!感謝您的快速解答!
btw'int&n3'不是C,它的C++表示法。 –
你還沒有解決任何問題,代碼泄漏了字符串的內存。 –
可能重複的[Char *編組在C#](http://stackoverflow.com/questions/1808581/char-marshalling-in-c-sharp) –