在 Microsoft 的一个主要互操作程序集中声明的方法是错误的。
声明为:
void Write(object[] psarray);
这是不正确的,实际上应该声明为:
void Write([In, MarshalAs(UnmanagedType.SafeArray)] object[] psarray);
我需要强制编译器在调用原始方法时使用[In, MarshalAs(UnmanagedType.SafeArray)]
。
我不反对做一些像的事情:
object[] parameters = new Object[1];
parameters[0] = theStringIWantedToPass;
thing.GetType().InvokeMethod(
"write",
BindingFlags.InvokeMethod,
null,
thing,
parameters);
但我必须知道如何覆盖 InvokeMethod 以使用 UnmanagedType.SafeArray 编码。
注意:我说“喜欢”,因为我不知道使用反射调用方法是否能完成我需要的。关键是我不反对长时间调用方法,或者加载寄存器和发出汇编 JMP 指令,只要 .NET 允许这类事情。
注意:我不能用不同的签名重新声明类,因为那是一个不同的类。
最佳答案
克服这个缺点的一种方法是拆卸 PIA,修复问题然后重建。
这不是我或我的一个伙伴在过去第一次使用互操作程序集执行此操作。
关于C#:如何在强制不同编码的同时调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/489596/