C#:如何在强制不同编码的同时调用方法?

标签 c# .net reflection binding

在 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/

相关文章:

c# - 使用 PRISM 模块和 MVVM 的程序架构

.net - 一次性清除azure服务总线队列

c# - 确定方法参数的上下文

struct - Racket:从结构中提取字段 ID

C# 空合并运算符与空集合和空集合之间的 OR 运算符结合时的行为不同

c# - 在行搜索结果后更新 DataGridView

c# - 如果默认字符串为空,为什么我不能使用 String.Contains()?

c# - 如何将加载的程序集提供给 C# 中的 Roslyn 工作区

c# - 在运行时更改对象类型,维护功能

c# - 计算谁先冲过终点线 (C# UNITY)