当一个程序集暴露出多余(但缺失)的依赖关系时,有没有一种干净的方法来压制或忽略它?
情境:
某些应用在FooUtil
中使用CoolAssembly.dll
类。唯一值得关注的方法是FooUtil.AwesomeMethod1
和FooUtil.AwesomeMethod2
,它们都只有原始类型的参数,并且都返回void。
FooUtil
实施IFooUtil
,公开公开.ProblematicMethod
,这是一种返回CrazyNamespace.Bar
的方法。 CrazyNamespace
在一个不可用的程序集中定义。
现在我可以反汇编FooUtil
并在没有不必要的依赖项的情况下重建它,但这是核选项,我想避免它。所以......
CrazyNamespace
的伪造,只会泄露FooUtil's
泄漏类型依赖项的虚拟替代? 我认为如果依赖链变深或纠结,#2可能变得毛茸茸,但这是我无法控制的。我无法知道CrazyNamespace.Bar
所依赖的所有内容,但从逻辑上讲,我只需要担心FooUtil
公开暴露(和/或非公共消费)的子集。如果#2原则上是可能的,那么FooUtil's
依赖程度是否可被发现? (我正在考虑从非公共呼叫站点消耗的方法签名。)
答案 0 :(得分:2)
“干净”这个词不在桌面上。只要程序集没有强名称,就可以使用正确的[AsssemblyVersion]和显示名称创建它的虚拟版本,并让编译器和CLR接受它作为替代。当然,您需要将方法实现为throw new NotImplementedException()。你当然不能保证他们不会抛出。
如果名字很强,那么你的选择就会大幅减少。需要Ildasm.exe + ilasm.exe,至少要改变.assembly
指令,这样你的虚拟装配方法才能再次运行。
这不是一个好地方。与装配所有者合作,提出更好的方法。