- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在普通的本地库中,我可以通过简单地在导出中构建一个具有完全相同的函数签名的 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/
我是一名优秀的程序员,十分优秀!