c# - 如何在.NET 中包装程序集?

标签 c# wrapper

在普通的 native 库中,我可以通过简单地在导出中构建具有相同函数签名的 dll 来包装另一个 dll 并监视调用,有时甚至可以调用真正的 dll。

在托管 C# 中,我有一个名为“A”的 dll,它是另一个应用程序的插件,该应用程序具有派生自另一个我称为 dll“B”的 dll 中的类的类。我想为“B”制作一个包装DLL,这样“A”就可以与“B”的包装版本一起运行,甚至可能根本不使用“B”的真实版本。

B 也有静态方法和其他类,我希望能够重新定义这个准包装器中的签名/声明,并让“A”程序集使用它。

插件dll A:

using baseDllB;
public class foopluginA : pluginclassB
{
   public void methodbaz() { base.doStuff(); pluginclassB.doStaticStuff(); }
}

基础 dll B:

namespace baseDllB
{
   public class pluginclassB
   {
       public void doStuff()
       {
        //Do stuff
       }
       public static void doStaticStuff() { /*Do more stuff*/ }
   }
}

插件dll显然引用了B,所以我想要做的是重新创建B,以便我能够执行日志记录等。

有哪些方法可以做到这一点?

最佳答案

您当然可以编写一个程序集,其中有一个类将其所有方法调用和内部状态转发给其他类。但是,您必须克服一些困难。

您必须用新的包装器程序集替换对原始程序集的引用。

您必须将包装器中的类更改反射(reflect)到被包装的类中。这可能很重要,特别是当内部状态包含私有(private)成员时。如果是静态类,那就容易多了。

如果您希望包装器程序集能够加载多种包装程序集,例如选择要转发到哪个类,则需要编写一个接口(interface)并使包装程序集从该接口(interface)派生,否则包装器程序集中的代码将变得非常复杂。

如果您希望包装器程序集是完全动态的,这意味着它在运行时加载其包装的目标,并且仅加载您想要的目标,则需要大量使用反射来从包装的类中获取方法和其他项。

关于c# - 如何在.NET 中包装程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6933581/

相关文章:

java - jsp Java 中的连接字符串有问题吗?

c# - ASP.NET 捆绑/缩小和嵌入式资源

c# - 如果我在 Windows 窗体的 Form_Load 事件上抛出异常,为什么什么也没有发生?

c# - 我怎样才能避免到处创建新的包装器对象?

java - 交换 ArrayList 中的两个对象

c# - 请求有关类设计、继承/聚合的建议

c++ - 如何将 C 结构包装在 C++ 类中并保持相同的名称?

c# - 如何在 Automation Anywhere 等 RPA 工具中模拟击键

javascript - 包装 JavaScript 文件以拦截传出请求

c# - EF Core 5.0 加入多对多使得一对多无法确定