生成现有的.NET库周围的.NET DLL包装器

6
我是一名有用的助手,可以为您翻译以下内容:

我有一个名为ExpensiveAndLargeObfuscatedFoo.dll的dll文件。假设它定义了一个名为ExpensiveAndLargeObfuscatedFooSubClass的类型。它已经被编译为.NET。

是否有任何工具(免费、付费或其他),可以生成c#或vb类文件,仅包装在这个昂贵的dll中定义的所有内容周围?这样我就可以添加功能、修复错误(CorpFUBAR不会修复)、添加日志等等?

简而言之,我想要的输出如下所示:

namespace easytoread {
    public class SubClass {
        private ExpensiveAndLargeObfuscatedFoo.SubClass _originalSubClass;
        public SubClass() {
            this._originalSubClass = new ExpensiveAndLargeObfuscatedFoo.SubClass ();
        }
        public string StupidBuggyMethod(string param1,int param2) {
            return _originalSubClass.StupidBuggyMethod(param1, param2);
        }
    }
}

它必须处理自定义返回类型以及原始类型

namespace easytoread {
    public class SubFooClass {
        private ExpensiveAndLargeObfuscatedFoo.SubFooClass _originalSubFooClass;
        public SubFooClass() {
            this._originalSubFooClass= new ExpensiveAndLargeObfuscatedFoo.SubFooClass ();
        }
        private SubFooClass(ExpensiveAndLargeObfuscatedFoo.SubFooClass orig) {
            this._originalSubFooClass = orig;
        }
        public SubFooClass StupidBuggyMethod(string param1,int param2) {
            return new SubFooClass(_originalSubFooClass.StupidBuggyMethod(param1, param2));
        }
    }
}

对于每个定义的类,都要这样做。

基本上,是一种简陋的动态代理?(耶,Castle Project太棒了!)

我们还想重命名一些包装类,但工具不需要这样做。

如果不重命名,我们将能够用新生成的程序集替换旧的程序集,更改使用语句,并像什么都没有发生一样继续进行(除了已修复的错误!)

它只需要检查dll并进行代码生成。生成的代码甚至可以是VB.NET、IronPython或任何CLR。

这是一个很滑的坡道,我不喜欢我最终到达这里的方式,但这似乎是正确的方法。我看了看Castle Project,但除非我弄错了,否则有两个原因不行:1)我不能重命名任何东西(别问为什么),2)没有一个程序集的方法被声明为虚拟或可重写。即使他们是,我也必须手动覆盖数百种类型,听起来并不好玩。


1
我怀疑已经存在这样的工具,但你可以使用反射、文件夹镜像命名空间等方法来实现。 - Guillaume86
3
我不知道这是否有帮助,但你可能想了解CLR中的类型转发。 - M.Babcock
3个回答

4

ReSharper可以帮助你完成很多工作。

你需要声明一个基本类:

namespace easytoread {
    public class SubClass {
        private ExpensiveAndLargeObfuscatedFoo.SubClass _originalSubClass;
    }
}

然后,选择ReSharper > Edit > Generate Code (Alt+Ins),选择“委托成员”,全选,然后让它生成代码。

它不会用自定义类包装返回值(它将返回原始类型),因此这仍然需要手动添加。


如果我只需要包装几个东西,那这将是一个很好的选择,不幸的是,我需要处理成百上千个类。 - scaryman

2
似乎最佳答案是“没有这样的工具”。因此,我将尝试在下班后编写自己的工具。如果我编写了有用的东西,我会在Github上更新并在此处通知。
更新 Visual Studio 2012 Fakes似乎很有前途。http://msdn.microsoft.com/en-us/library/tfs/hh549175(v=vs.110).aspx-我们已经转到其他方案,但我可能会尝试创建一个虚拟对象,然后在未来将其作为替换dll插入。

1
  1. 如果您可以访问源代码,请在源代码中重命名并修复。
  2. 如果您无法访问(且您可以合法地这样做),请使用一些工具,如Reflector或dotPeek获取源代码,然后转到第一点。

不确定为什么它被投票否决了。这可能是唯一有机会起作用的解决方案,因为为某些/所有类创建代理通常不会影响库与其自己的类的工作方式(即MyInnerClass.MyInnerMethod()将继续调用相同的代码,无论外部代理如何)。请注意,这样做很可能违反许可证。 - Alexei Levenkov
一个很好的建议,但我必须仔细考虑反编译涉及的法律问题,尤其是因为汇编代码已经被混淆了。混淆意味着他们已经努力防止这种情况发生,因为他们的代码不再是“明文可见”的了。 - scaryman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接