我有一个实例,我正在使用别人的库,作为DLL导入。我只想更改该类中的两个私有函数。我真的很喜欢在DLL外部执行此操作,所以当其他人发布新的DLL时,我可以快速更新我的DLL,而不必更改源代码并构建我自己的DLL。
有可能这样做吗?我可以以某种方式从DLL外部覆盖C#dll中的一些私有函数吗?
答案 0 :(得分:1)
我真的很喜欢在DLL外部执行此操作,所以当其他时 人发布了一个新的DLL,我可以快速更新我的DLL
想一想。假设您成功拦截/覆盖其私有函数。当下一个版本删除这些功能或改变其行为时会发生什么?
成员通常是私人的。
有效的方法是将外部程序集包装为控制/抽象行为,或者覆盖为继承而设计的公共/受保护成员。
通过反思调用私人成员很容易。 修改以使其调用者使用新的实现更复杂。
并且不必更改源代码并构建我自己的DLL。
如果你真的真的需要这样做,改变源代码可能是最直接的方法。*你也可以查看IL weaving这可能适合这项任务。
更好的方法是与作者合作,使图书馆在您需要的领域更具可扩展性。
*这假设您具有对源的合法访问权或允许反编译程序集。这可能违反许可证中的逆向工程条款,使维护合同无效等。我不是律师。
答案 1 :(得分:0)
我认为您可以使用TypeBuilder.DefineMethodOverride。有关详细信息,请参阅此问题Is there a way to "override" a method with reflection?。
如果这不起作用,您可以尝试使用反射构建运行时代理类,但是替换对要实现的方法的调用。那当然是一点伏都教。代码检测也做类似的事情 - 将自定义代码注入到方法中。事实上,这就是我建议的研究 - 仪器如何工作。