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

C# 如何通过另一个DLL(托管)自动代理一个DLL(托管)?,c#,dll,system.reflection,C#,Dll,System.reflection,我有一个奇怪的要求 实际上,我们的解决方案是: APP.EXE->MYDLL.DLL APP.EXE使用MYDLL程序集方法 现在,客户端请求实现此变体: APP.EXE->MYDLL\u PROXY.DLL->MYDLL.DLL动态加载 MYDLL_PROXY.DLL必须像代理一样工作,因此,调用MYDLL_PROXY.Method1将加载外部MYDLL.DLL并在其上调用Method1并返回结果 像这样的反射: //MYDLL_PROXY.dll ass = Asse

我有一个奇怪的要求

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

APP.EXE->MYDLL.DLL APP.EXE使用MYDLL程序集方法

现在,客户端请求实现此变体:

APP.EXE->MYDLL\u 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() { ... }
}
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();
    }
}

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

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

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

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


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

,-是一个旧项目,必须使用Framework 2.0,所以我没有访问动态库的权限:/为什么还要使用反射?您建议@DavidBrowne Microsoft做什么?我已经开发了一个公共接口,所以,主要的伪代理dll和真正的外部dll实现,所以现在我卡住了!我需要扩展它,但我不知道如何使用动态链接库进行动态加载:/对于重写解决方案,事件呢?比方说,应用程序调用mydll_proxy.dll方法START,重写到mydll.dll:在mydll抛出已启动事件之后启动,但现在我如何将事件传回mydll_proxy.dll?也许用界面听事件更简单?我试着在接下来的几天里专注于这项任务。谢谢你的选择。1-在用户端处理它。如果没有人订阅,请通过它。否则,请像使用重写技术处理其他方法一样处理它。2-订阅活动。例如,搜索委托。结合调用指令并自行订阅。3-为每次调用调用您的代码,搜索要调用的callvirt指令或DynamicInvoke并调用您的代码。每种方法都有它的优点和缺点,每个都有结束的情况要考虑。如果您可以访问原始dll,并且可以对其进行更改,即使其实现一个接口,并且原始代码不会更改,那么您的方法可能是最合适的。对于程序员来说,这将是最容易的,因为解决方案的学习曲线很简单。如果存在限制和其他要求,有时就无法逃避另一种更具灵活性的动态方法。不管怎样,在您开始使用界面的解决方案中,现在是什么阻止了您?除了有时间花在这项任务上之外,是的,我停止自己处理界面事件,但我认为订阅方式+界面是我可以选择的最好和干净的方式。谢谢