私がやろうとしているのは、マネージ コードで同じメソッドを使用して、ネイティブ DLL の 2 つのバージョンに対してコンパイルできるようにすることです。
たとえば、これは私のネイティブ メソッド シグネチャになります。
__declspec(dllexport) void MyClass::NativeFoo(const TCHAR* txt)
char*
あるビルドで a を受け入れ、別のビルドで aを受け入れるようにコンパイルします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 呼び出しで使用される を変更しません。私は何を間違っていますか?