我有一个奇怪的要求,
实际上我们的解决方案是:
APP.EXE
使用MYDLL
汇编方法。
现在客户请求实施此变体:
MYDLL_PROXY.DLL必须像代理一样工作,因此,调用“ MYDLL_PROXY.Method1”将加载外部MYDLL.DLL并对其调用Method1并返回结果。
像这样的反射:
//MYDLL_PROXY.dll
ass = Assembly.LoadFrom(@"C:\mydll.dll");
String MyGenericMethod ="Something"
Type MyType = ass.GetTypes()[0];
Object o = Activator.CreateInstance(MyType);
MethodInfo Method = ass.GetTypes()[0].GetMethod(MyGenericMethod);
return Method.Invoke(null, new object[] { /* parameters go here */ });
因此,在生气之前,有一种快速的方法来创建一个伪造的dll,该dll充当另一个代理的代理?
我需要代理所有:方法,属性,事件。
感谢您的帮助。
NB :是一个旧项目,必须使用Framework 2.0
更新
如果反射不是正确的方法,则可以进行这种封装吗?那事件呢?
外部DLL:
public class NastyExternalClassInExternalDll
{
public void Foo() { ... }
}
MainDLL:
public interface IFooable
{
void Foo();
}
public sealed class NastyExternalClassWrapper : IFooable
{
private readonly NastyExternalClassInExternalDll original;
public NastyExternalClassWrapper(NastyExternalClass original)
{
this.original = original;
}
public void Foo()
{
original.Foo();
}
}
答案 0 :(得分:1)
一种方法是使用您在问题中所写的接口并包装所有method \ properties。对于事件,您还需要在代理中注册它们并采取行动。
其他方法是使用重写概念来实现。 这可以通过两种方法完成。
通常:读取原始dll(带有cecil,dnlib等),并为您鼓励的每个方法或属性调用代理代码,然后继续执行实际代码。毕竟,编织之后,保存dll,您就完成了。 静态方法的缺点是,对于原始dll中的每个更改,都需要再次运行包装器。
动态地:将CLR Profiler附加到原始dll,并在任何方法或属性调用之前拦截对代码的所有调用。
对于每种方法,我无法在此进行更深入的介绍,因为这很长,但是您可以继续阅读,如果您有特定的问题,请告诉我。