如何通过另一个DLL(托管)自动代理DLL(托管)?

时间:2019-12-04 10:02:14

标签: c# dll system.reflection

我有一个奇怪的要求,

实际上我们的解决方案是:

  • APP.EXE-> MYDLL.DLL

APP.EXE使用MYDLL汇编方法。

现在客户请求实施此变体:

  • APP.EXE-> MYDLL_PROXY.DLL -> MYDLL.DLL(动态加载)

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();
    }
}

1 个答案:

答案 0 :(得分:1)

一种方法是使用您在问题中所写的接口并包装所有method \ properties。对于事件,您还需要在代理中注册它们并采取行动。

其他方法是使用重写概念来实现。 这可以通过两种方法完成。

通常:读取原始dll(带有cecil,dnlib等),并为您鼓励的每个方法或属性调用代理代码,然后继续执行实际代码。毕竟,编织之后,保存dll,您就完成了。 静态方法的缺点是,对于原始dll中的每个更改,都需要再次运行包装器。

动态地:将CLR Profiler附加到原始dll,并在任何方法或属性调用之前拦截对代码的所有调用。

对于每种方法,我无法在此进行更深入的介绍,因为这很长,但是您可以继续阅读,如果您有特定的问题,请告诉我。