如何在.net中包装程序集
本文关键字:包装 程序集 net | 更新日期: 2023-09-27 18:04:31
在普通的本机库中,我可以包装另一个dll并通过简单地在导出中构建具有相同函数签名的dll来监视调用,有时甚至可以调用真正的dll。
在托管c#中,我有一个名为"a"的dll,这是另一个应用程序的插件,该应用程序有一个类派生自另一个我称为dll"B"的dll中的类。我想为"B"做一个包装器dll,这样"a"就可以使用"B"的包装版本,甚至可能根本不使用"B"的真实版本。
B也有静态方法和其他类,我希望能够在这个准包装器中重新定义签名/声明,并让"A"程序集使用它。
Plugin dll A:
using baseDllB;
public class foopluginA : pluginclassB
{
public void methodbaz() { base.doStuff(); pluginclassB.doStaticStuff(); }
}
Base dll B:
namespace baseDllB
{
public class pluginclassB
{
public void doStuff()
{
//Do stuff
}
public static void doStaticStuff() { /*Do more stuff*/ }
}
}
插件dll
s参考B显然,所以我想做的是重新创建B
,我能够执行日志记录等。
有哪些方法可以做到这一点?
您当然可以编写一个程序集,其中有一个类将其所有方法调用和内部状态转发给其他类。然而,你必须克服一些困难。
必须用新的包装程序集替换对原始程序集的引用。
必须将包装器中的类更改反映到被包装的类中。这是非常重要的,特别是当内部状态包含私有成员时。如果它是一个静态类,那就容易多了。
如果您希望包装程序集能够加载多种包装程序集,例如选择要转发给哪个类,则需要编写接口并使包装程序集派生自该接口,否则包装程序集中的代码将变得非常复杂。
如果您希望您的包装程序集是完全动态的,这意味着它在运行时加载其包装的目标,并且只加载您想要的那个,那么您需要大量使用反射来从包装的类获取方法和其他项。
一种可能是RealProxy
。您可以使用RealProxy
类来提供其他类的代理实例,客户机代码不会知道其中的区别。