我在C ++中挥动一个接收LPCOLESTR类型参数的方法。我通过C#访问此方法,但我无法在String和此类型之间进行正确的转换。
让我们说C ++中的signinature方法是:
void Something(LPCOLESTR str)
在C#中,我正在尝试调用它(通过DLL访问该方法的所有引用问题已经解决):
String test = "Hello world";
Something(test);
但当然没有运气。如果有人能帮助我,我会很高兴。谢谢!
代码段:
例如,这是我的C ++部分代码,在MixedCodeCpp.h(CLR类库)文件中定义
#include "windows.h"
#pragma once
using namespace System;
namespace MixedCodeCpp
{
public ref class MyClass
{
public:
HRESULT Something(LPCOLESTR str)
{
return S_OK;
}
};
}
这是我在C#中的代码(我通过Visual Studio在C#项目中添加了对C ++项目的引用):
StringBuilder sb = new StringBuilder();
sb.Append("Hello world");
MixedCodeCpp.MyClass cls = new MixedCodeCpp.MyClass();
cls.Something(sb);
答案 0 :(得分:1)
参数将在C#侧显示为Char *。这需要不安全的代码,如下所示:
unsafe static void CallSomething(MyClass obj, string arg) {
IntPtr mem = Marshal.StringToCoTaskMemUni(arg);
try {
obj.Something((Char*)mem);
}
finally {
Marshal.FreeCoTaskMem(mem);
}
}
使非常将LPCOLESTR公开给其他托管代码没什么意义。这个方法真的应该接受一个String ^并在内部转换为wchar_t *。
答案 1 :(得分:0)
尝试使用StringBuilder而不是String:
System.Text.StringBuilder test = new System.Text.StringBuilder ();
test.Append("Hello world");
Something(test);
我在pinvoke中以这种方式使用它,需要各种字符串指针作为参数的Win32函数。不确定它是否适用于您的API,但值得一试。这是关于流程的some MSDN info。并here is another。
以下是您的import语句和声明应该是什么样子的任意示例。 (要带上一粒盐。)
[DllImport(SomeLib.SomeName, CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool Something(StringBuilder pMyString);
StringBuilder str = new StringBuilder(MAX_PATH);
DWORD uSize;
bool b = Something(str);