如何在运行时向DLL添加代码

时间:2009-05-20 04:36:04

标签: c# .net dll

让我们说在我的.NET类的构造函数中,我想编写实际上会动态地向我的类添加方法的代码。所以现在当我反思我的课时,我会看到方法,就像我第一次构建项目时那样,方法不存在

我怎样才能做到这一点?

我一直在查找CodeDom,但它有点令人困惑

5 个答案:

答案 0 :(得分:3)

装入装配体后,无法更改装配体。您可以使用Reflection.Emit或CodeDom动态编译新程序集,其类似于您的类+额外方法,但它不会更改现有(至少在运行时存在)类。潜在地,你可以在一个单独的AppDomain中加载你的类,创建一个新的类,它是附加的“副本”,然后在你的主AppDomain中加载该程序集(并卸载你加载原始类的那个)。你仍在创建一个新类,而不是添加到现有类,但效果会相似。

但是,您可以在加载类之前使用代码注入来插入代码。 .NET有一些代码注入框架可以帮助解决这个问题......但这与您的具体问题不同。

答案 1 :(得分:1)

你必须使用Reflection.Emit或Mono.Cecil或PostSharp。

所有这些都很容易学习......

答案 2 :(得分:0)

我......无法想象你为什么要这样做。

你能解释一下你想要的原因吗?

相反,尝试使用相同接口的不同具体实现,或者如果共享大部分代码,则尝试使用抽象类。

答案 3 :(得分:0)

你可以在不使用CInject(Codeplex的开源)学习任何额外内容的情况下做到这一点。编写要在C#或VB.NET中注入的代码,然后通过CInject处理它以添加到托管程序集中。

答案 4 :(得分:0)

我同意使用appdomain domcomplie函数的@ reed-copsey。您可以创建一个继承插件基类的插件类,您可以添加所需的所有类。当它在appdomain中编译时,它甚至可以为你提供注入该类的编码错误。然后它不会编译那个specfic类。至少你会知道代码有问题。