在现有的.net库周围生成.net dll包装器

时间:2012-03-28 22:08:18

标签: c# .net code-generation clr wrapper

我有一个名为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));
        }
    }
}

依此类推每一个定义的类。

基本上,穷人的动态代理? (耶,城堡项目太棒了!)

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

如果没有重命名,我们就可以用新生成的程序集替换旧程序集,使用语句进行更改并继续执行,就像没有发生任何事情一样(除了修复了错误!)

它只需要检查dll并执行代码生成。生成的代码甚至可以是VB.NET,或者是ironpython,也可以是任何CLR。

这是一个滑坡,我不高兴我到了这里,但这似乎是要走的路。我查看了Castle项目,但除非我错了,因为两个原因无效:1)我无法重命名(不要问),2)没有任何程序集方法被声明为虚拟或甚至可以覆盖。即使它们是,我也必须手动覆盖数百种类型,这听起来并不好玩。

3 个答案:

答案 0 :(得分:3)

ReSharper可以为您完成大部分工作。

您需要声明一个基本类:

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

然后,选择ReSharper>编辑>生成代码(Alt + Ins),选择“委派会员”,选择全部,然后让它生成代码。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

似乎最好的答案是“没有这样的工具”。所以,我稍后会把自己写成一个非工作时间的项目。如果我得到了一些有用的东西,我会把它改成并在这里更新。

UPDATE Visual Studio 2012 Fakes似乎很有前途。 http://msdn.microsoft.com/en-us/library/tfs/hh549175(v=vs.110).aspx - 我们继续前进,但我可能会尝试创建一个假的,然后在将来某个时候将其作为替代dll放入