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,比任何其他存根库都大) 因此,为了使这项工作发挥作用,我做了以下工作:
外部“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));