C#DllImport返回类型为TCHAR? 我有一个C++函数,具有以下签名< /P> TCHAR *DXGetErrorDescription9(HRESULT hr);

C#DllImport返回类型为TCHAR? 我有一个C++函数,具有以下签名< /P> TCHAR *DXGetErrorDescription9(HRESULT hr);,c#,interop,dllimport,C#,Interop,Dllimport,我有 [DllImport("dxerr9.dll",EntryPoint="GetDXErrorString9")] static public extern string GetDXErrorString9(int DXError); 如何将字符串marshall到TCHAR*?谢谢在做了一点挖掘之后,结果证明directx错误例程不是作为DLL提供的,而是作为LIB提供的,您可以静态链接到可执行文件中。我应该根据dxer9.lib的大小来计算(它是5M,比任何其他存根库都大) 因

我有

[DllImport("dxerr9.dll",EntryPoint="GetDXErrorString9")]
    static public extern string GetDXErrorString9(int DXError);

如何将字符串marshall到TCHAR*?谢谢

在做了一点挖掘之后,结果证明directx错误例程不是作为DLL提供的,而是作为LIB提供的,您可以静态链接到可执行文件中。我应该根据dxer9.lib的大小来计算(它是5M,比任何其他存根库都大)

因此,为了使这项工作发挥作用,我做了以下工作:

  • 制作一个“包装器”本机dll,包装所有错误处理库函数。因为只有3个(DXGetErrorDescription、DXGetERrorString和DXTrace),所以这没什么大不了的
  • 让.NET调用包装器函数
  • 您可以在VisualStudio中通过创建Win32项目(更改应用程序设置使其成为dll并导出符号)来完成此操作。我叫敏“导演说唱歌手”

    在包装器项目中,为DXGetErrorDescription添加一个传递。我调用了我的DXGetErrDescPassThrough():

    外部“C”块很重要(与DeCangle C++名字有关)。此项目需要#包含“dxerr.h”并静态链接dxerr.lib,因此您必须将directx sdk包含目录添加到包含路径,将directx sdk库目录添加到库路径

    然后让托管代码从包装器dll导入调用:

    [DllImport("DirectXErrWrapper.dll", CharSet=CharSet.Unicode)]
    static public extern string DXGetErrDescPassThrough(int DXError);
    
    在2005年,本机项目默认使用unicode,因此DllImport需要指定unicode。最后,通过以下方式从托管代码调用它:

    Debug.WriteLine("DXGettErrDescPassThrough=" + DXGetErrDescPassThrough(0));
    
    在这种情况下,调用会将“函数已成功完成”打印到调试设备,因为0是成功的

    (前一员额如下)

    这看起来像是DirectX函数之一(C++而不是C#AFAIK)。我敢肯定它附带了unicode和ansi版本。 在unicode上编译时,TCHAR将映射到unicode(T是类型的助记符;unicode上的unicode,mbcs上的多字节字符集,否则为ansi)。 您通常可以使用CharSet=CharSet.Auto,但如果这会导致兼容性问题(例如,您必须使用ansi字符串,因为您已经移植的某些结构需要它),您可以使用与您的项目一致的字符串(如果您都是Unicode或CharSet.ansi,则可以使用CharSet.Unicode)将其编组为C#字符串应该没有问题。您可能需要将其修饰为[OUT],尽管返回值可能隐式为OUT。
    我也希望DirectX按照标准的[out,retval]约定与TLB一起发货!嗨,我还是拿不到。我试过很多惯例。我的最新版本是[DllImport(“dxerr9.dll”,EntryPoint=“DXGetErrorString9”,CharSet=CharSet.Ansi,CallingConvention=CallingConvention.Cdecl)]静态公共外部字符串DXGetErrorString9(长DXError);有什么想法吗?
    Debug.WriteLine("DXGettErrDescPassThrough=" + DXGetErrDescPassThrough(0));