繁体   English   中英

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

[英]How to automatically Proxy a DLL(managed) through another DLL(managed)?

我有一个奇怪的要求,

其实我们的解决方案是这样的:

  • 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 的代理?

我需要代理所有:方法、属性、事件。

谢谢你的帮助。

注意:是一个旧项目,必须与 Framework 2.0 保持一致


更新

如果反射不是正确的方式,像这样的封装可能吗? 事件呢?

外部DLL:

public class NastyExternalClassInExternalDll
{
    public void Foo() { ... }
}

主DLL:

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

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

另一种方法是通过重写概念来实现。 这可以通过两种方法进行。

静态:读取原始 dll(使用 cecil、dnlib 等),对于您鼓励的每个方法或属性,调用您的代理代码,然后继续实际代码。 毕竟,那编织,保存dll就大功告成了。 静态方法的缺点是对于原始dll 的每次更改,都需要再次运行包装器。

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

对于这些方法中的每一种,我无法在这里深入介绍,因为它会很长,但是您可以阅读它们,如果您有具体问题,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM