gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:36:33 26 4
gpt4 key购买 nike

在普通的本地库中,我可以通过简单地在导出中构建一个具有完全相同的函数签名的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com