Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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# 编组煤焦* 我在C++ DLL上有以下方法签名: extern char *bpStringCalc(char *bpDirectory, char *issString);_C#_.net_C++_Visual C++ - Fatal编程技术网

C# 编组煤焦* 我在C++ DLL上有以下方法签名: extern char *bpStringCalc(char *bpDirectory, char *issString);

C# 编组煤焦* 我在C++ DLL上有以下方法签名: extern char *bpStringCalc(char *bpDirectory, char *issString);,c#,.net,c++,visual-c++,C#,.net,C++,Visual C++,我试着用这个从c#调用它: [DllImport(@"C:\MuniAxis\Bp\BpDLL.dll", CharSet = CharSet.Ansi)] [return: MarshalAs(UnmanagedType.LPStr)] public static extern string bpStringCalc([MarshalAs(UnmanagedType.LPStr)] string bpDirectory,

我试着用这个从c#调用它:

[DllImport(@"C:\MuniAxis\Bp\BpDLL.dll", CharSet = CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.LPStr)]
public static extern string bpStringCalc([MarshalAs(UnmanagedType.LPStr)] string bpDirectory,
                                         [MarshalAs(UnmanagedType.LPStr)] string issString);
但它不断得到这样的例外:

'控制台应用程序1!ConsoleApplication1.Program::bpStringCalc' 使堆栈不平衡。这是 很可能是因为那只松鼠 签名与非托管签名不匹配 目标签名。检查 调用约定和参数 PInvoke签名与目标匹配 非托管签名

有什么想法吗


多亏了

不平衡堆栈可能更多地与调用约定有关,而不是与实际参数有关。默认情况下,C++使用<代码>C默认为
\uu stdcall
,因为
\uu stdcall
是Win32使用的约定。你需要在C语言中设置你的导入语句,或者你需要在C++二进制文件中指定<代码>
编辑:对上述内容进行编辑是为了修复这样一个事实,即
\uuuu cdecl
\uu stdcall
各自只有一个前导下划线;)

堆栈失衡可能更多地与调用约定有关,而不是与实际参数有关。默认情况下,C++使用<代码>C默认为
\uu stdcall
,因为
\uu stdcall
是Win32使用的约定。你需要在C语言中设置你的导入语句,或者你需要在C++二进制文件中指定<代码>

编辑:对上述内容进行编辑是为了修复这样一个事实,即
\uuuu cdecl
\uu stdcall
各自只有一个前导下划线;)

尝试在导入时指定调用约定,或在导出时指定调用约定。请参阅。

尝试在导入时指定调用约定的
Cdecl
或在导出时指定调用约定的
\u stdcall
。请参阅。

据我所知,使用
StringBuilder而不是string会让您更幸运。在调用该方法之前,请确保将string实例固定在内存中。@BrokenGlass:如果参数不是问题,这应该不会有什么区别。据我所知,使用
StringBuilder会让您更幸运。
而不是字符串。在调用该方法之前,请确保将字符串实例固定在内存中。@BrokenGlass:如果参数不是问题,则应该没有区别。+1表示类似的问题链接,以及(正确地)在
\uu stdcall
之前加两个下划线,这是答案。C++默认值为“代码>”>“CyDCL < /Cord>”,但由于某些疯狂的原因,P/调用默认值为“代码>”它根据平台选择
StdCall
Cdecl
。@DeadMG:它默认为
\uu StdCall
,因为P/Invoke最常用的用法是调用Win32函数,而所有Win32都使用
\uu StdCall
。@Billy:很难不提供链接,考虑到我在几分钟前回答了这个问题:)+1表示类似的问题链接,以及(正确地)在
\uu stdcall
前面加了两个下划线,这是答案。C++默认值为“代码>”>“CyDCL < /Cord>”,但由于某些疯狂的原因,P/调用默认值为“代码>”它根据平台选择
StdCall
Cdecl
。@DeadMG:它默认为
\uu StdCall
,因为P/Invoke最常用的用法是调用Win32函数,而所有Win32都使用
\uu StdCall
。@Billy:很难不提供链接,考虑到我几分钟前回答了这个问题:)