Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.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# DLLimport返回gobbledygook 我在C++头文件< /p>中有这个定义 extern "C" __declspec(dllexport) const char* __stdcall GetId(const My_Polyhedron *obj);_C#_.net_.net 4.0_Pinvoke - Fatal编程技术网

C# DLLimport返回gobbledygook 我在C++头文件< /p>中有这个定义 extern "C" __declspec(dllexport) const char* __stdcall GetId(const My_Polyhedron *obj);

C# DLLimport返回gobbledygook 我在C++头文件< /p>中有这个定义 extern "C" __declspec(dllexport) const char* __stdcall GetId(const My_Polyhedron *obj);,c#,.net,.net-4.0,pinvoke,C#,.net,.net 4.0,Pinvoke,这是用C写的# 它还让我狼吞虎咽 238方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方

这是用C写的#

它还让我狼吞虎咽

238方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方238方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方崮崮崮崮崮崮崮崮崮崮崮崮崮崮崮崮崮崮崮崮崮崮崮崮þîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþ2§{€ûW@_èp

在.NET4.0中,但它在.NET3.5中运行良好

注意:

  • 我在
    DllImport
    中尝试了
    charset=…
    (所有可能的设置,例如
    charset.Unicode

  • 我尝试让它返回
    IntPtr
    而不是
    string
    ,然后使用
    marshall.PtrToStringAnsi
    将其转换回
    string

  • 我尝试了
    StringBuilder
    而不是
    string


  • 上述所有解决方案都不起作用。

    < P>如果你是C++代码的所有者,你可以修改函数,使它返回字符串为OUT参数:

    extern "C" __declspec(dllexport) void __stdcall GetId(
                      const My_Polyhedron *obj, char* result);
    
    然后在C#中使用此导入:

    请注意,
    result
    StringBuilder
    而不是
    string

    您必须首先通过使StringBuilder足够大来分配足够的空间

    可以这样称呼:

    StringBuilder result = new StringBuilder(1000);
    GetId(obj, result);
    
    使用
    result.ToString()
    获取字符串


    有一个
    return
    属性(它实际上不是一个属性)指定如何封送返回值:

    [return: MarshalAs(UnmanagedType.Bool)]
    
    但我没有在你的代码上试用过。

    也许这会有帮助…

    您是否也尝试过在两侧使用StdCall?@500 InternalServerError在.Net 4.0上,StdCall无法工作,它会引发PinVokesTack异常。我尝试关闭运行时异常,关闭后,它仍然返回goobledygook。在.Net 3.5上,Cdecl和StdCall都工作正常,返回我需要的正常字符串D.@ WiLaMe0.7:你有没有访问C++代码?我建议在本地模式下附加调试器。这里没有什么东西加起来。但是无论如何,返回这样的字符串肯定是错误的。封送器在返回的指针上调用<代码> COTASKMMESFORE /COMPUTE。你确定你希望这样吗?
    StringBuilder result = new StringBuilder(1000);
    GetId(obj, result);
    
    [return: MarshalAs(UnmanagedType.Bool)]