在普通的 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/