我想要做的是能够在托管代码中使用相同的方法针对本机 DLL 的两个版本进行编译。
例如,这将是我的本机方法签名:
__declspec(dllexport) void MyClass::NativeFoo(const TCHAR* txt)
它编译为接受char*
一个构建和wchar*
另一个构建。
pInvoke 签名如下所示:
[DllImport("Native.dll")]
private static extern void NativeFoo(string txt);
为了能够控制CharSet
pInvoke 调用使用的,我使用以下方法:
internal static void SetUnicodeMode(bool state)
{
MethodInfo m = typeof(ManagedFoo).GetMethod("NativeFoo", BindingFlags.NonPublic | BindingFlags.Static);
object[] atts = m.GetCustomAttributes(typeof(DllImportAttribute), false);
DllImportAttribute dllatt = (atts[0] as DllImportAttribute);
dllatt.CharSet = state ? CharSet.Unicode : CharSet.Ansi;
}
我在托管程序集启动时调用此方法(此时我知道是否需要使用 unicode 或 mbcs)。
该方法不会引发异常,但也不会更改CharSet
pInvoke 调用使用的方法。我究竟做错了什么?