我有一个名为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)没有任何程序集方法被声明为虚拟或甚至可以覆盖。即使它们是,我也必须手动覆盖数百种类型,这听起来并不好玩。
答案 0 :(得分:3)
ReSharper可以为您完成大部分工作。
您需要声明一个基本类:
namespace easytoread {
public class SubClass {
private ExpensiveAndLargeObfuscatedFoo.SubClass _originalSubClass;
}
}
然后,选择ReSharper>编辑>生成代码(Alt + Ins),选择“委派会员”,选择全部,然后让它生成代码。
它不会使用自定义类包装返回值(它将返回原始类型),因此仍然必须手动添加。
答案 1 :(得分:1)
答案 2 :(得分:1)
似乎最好的答案是“没有这样的工具”。所以,我稍后会把自己写成一个非工作时间的项目。如果我得到了一些有用的东西,我会把它改成并在这里更新。
UPDATE Visual Studio 2012 Fakes似乎很有前途。 http://msdn.microsoft.com/en-us/library/tfs/hh549175(v=vs.110).aspx - 我们继续前进,但我可能会尝试创建一个假的,然后在将来某个时候将其作为替代dll放入