Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;DLL LPCTSTR到C#字符串 我试图从C++到dcll得到字符串。 它输出不正确的符号-{栠搂珯獲긋ݳݳ贈琹玴ɡݳ⻜}_C#_C++_Dll - Fatal编程技术网

C++;DLL LPCTSTR到C#字符串 我试图从C++到dcll得到字符串。 它输出不正确的符号-{栠搂珯獲긋ݳݳ贈琹玴ɡݳ⻜}

C++;DLL LPCTSTR到C#字符串 我试图从C++到dcll得到字符串。 它输出不正确的符号-{栠搂珯獲긋ݳݳ贈琹玴ɡݳ⻜},c#,c++,dll,C#,C++,Dll,这是我的密码: C++ DLL 我的C代码读取C++ +DLL: [DllImport("ecrClassDll.dll", CharSet = CharSet.Unicode)] static extern void myClass(StringBuilder z); static void Main(string[] args) { StringBuilder z = new StringBuilder(); myClass(z); } 首先,确保您在C++中定义了 U

这是我的密码: C++ DLL

<>我的C代码读取C++ +DLL:

[DllImport("ecrClassDll.dll", CharSet = CharSet.Unicode)]
static extern void myClass(StringBuilder z);

static void Main(string[] args)
{
    StringBuilder z = new StringBuilder();
    myClass(z);
}

首先,确保您在C++中定义了<代码> Unicode < /Code >宏,以便输出<代码> WHARGYTT < /Code >数据,以及 LPCTSTR 意味着 conthWal查*t*。这就是 CalSc. Unicode 期望的。顺便说一下,如果您不打算支持ANSI版本,我也不会理会所有的<代码>e> 只要到处使用Unicode,代码就会更简单

也可以,你的C++函数返回一个<代码> int <代码>,但是你的C函数期望一个<代码>无效>代码>。你有一个错配(除非你打算把<代码> PreserveSig <代码> > <代码> false <代码> >

在C的边,当你提供<代码> StringBuilder < /C>时,它意味着你为C++提供了一个缓冲区,你希望它能填充那个缓冲区。正确的用法是这样的:

\u declspec(dllexport)int\u stdcall myClass(LPCTSTR z,intzsize)
{
_tcscpy_s(z,zSize,_T(“测试字符串”);
返回0;
}
[DllImport(“ecrClassDll.dll”,CharSet=CharSet.Unicode)]
静态外部intMyClass(StringBuilderZ,intzSize);
静态void Main(字符串[]参数)
{
StringBuilder z=新的StringBuilder(256);
myClass(z,z.容量);
}
但是您的代码返回一个指向静态字符串的指针,这是封送拆收器在这里不希望看到的

如果你想保持你的C++代码,你可以试试这个:

[DllImport("ecrClassDll.dll", CharSet = CharSet.Unicode)]
static extern int myClass(out string z);

static void Main(string[] args)
{
    string z;
    myClass(out z);
}

我承认我没有测试过,但是它应该与C++签名匹配C++签名。 如果所有操作都失败,您可以尝试自行封送数据:

[DllImport("ecrClassDll.dll")]
static extern unsafe int myClass(void** z);

static unsafe void Main(string[] args)
{
    void* z;
    myClass(&z);
    var str = Marshal.PtrToStringUni(new IntPtr(z));
}

我已经尝试了字符串,但我的控制台应用程序没有错误,仅此而已..如果我包括pdb文件,它会在CallDLL.exe中返回“0x7746ED0B(ntdll.dll)处未处理的异常:0xC0000374:堆已损坏(参数:0x774A4270)。”而C#堆中的字符串损坏,意味着签名不匹配…嗯,您可以尝试
[Marshallas](UnmanagedType.LPWStr)
但我认为它不会有太大变化。我在答案中添加了第三种方法。谢谢你的回答!我发现在我的例子中,“out string”只在4.0或更低版本的框架下工作,x86,并且只在发布模式下工作(我需要你帮助的原始DLL不是我的)。这很奇怪。只在x86中工作是可以的(你的C++ DLL是x86),但不工作在4.5 +和调试模式是一个红旗,我不能想到任何理由,这样会发生…
[DllImport("ecrClassDll.dll")]
static extern unsafe int myClass(void** z);

static unsafe void Main(string[] args)
{
    void* z;
    myClass(&z);
    var str = Marshal.PtrToStringUni(new IntPtr(z));
}