是否有可能回避C#中泄露的程序集依赖性

时间:2014-02-25 21:53:21

标签: c# dependencies assembly-resolution

当一个程序集暴露出多余(但缺失)的依赖关系时,有没有一种干净的方法来压制或忽略它?

情境:

某些应用在FooUtil中使用CoolAssembly.dll类。唯一值得关注的方法是FooUtil.AwesomeMethod1FooUtil.AwesomeMethod2,它们都只有原始类型的参数,并且都返回void。

FooUtil实施IFooUtil,公开公开.ProblematicMethod,这是一种返回CrazyNamespace.Bar的方法。 CrazyNamespace在一个不可用的程序集中定义。

现在我可以反汇编FooUtil并在没有不必要的依赖项的情况下重建它,但这是核选项,我想避免它。所以......

  1. 有没有办法简单地隐藏来自消费应用程序的泄漏依赖项,或者在应用程序中忽略它,只要在任何可能的调用堆栈中没有引用泄漏类型?
  2. 如果没有,是否可以将依赖项重定向到CrazyNamespace的伪造,只会泄露FooUtil's泄漏类型依赖项的虚拟替代?
  3. 我认为如果依赖链变深或纠结,#2可能变得毛茸茸,但这是我无法控制的。我无法知道CrazyNamespace.Bar所依赖的所有内容,但从逻辑上讲,我只需要担心FooUtil公开暴露(和/或非公共消费)的子集。如果#2原则上是可能的,那么FooUtil's依赖程度是否可被发现? (我正在考虑从非公共呼叫站点消耗的方法签名。)

1 个答案:

答案 0 :(得分:2)

“干净”这个词不在桌面上。只要程序集没有强名称,就可以使用正确的[AsssemblyVersion]和显示名称创建它的虚拟版本,并让编译器和CLR接受它作为替代。当然,您需要将方法实现为throw new NotImplementedException()。你当然不能保证他们不会抛出。

如果名字很强,那么你的选择就会大幅减少。需要Ildasm.exe + ilasm.exe,至少要改变.assembly指令,这样你的虚拟装配方法才能再次运行。

这不是一个好地方。与装配所有者合作,提出更好的方法。