.NET C#中的程序集排序

4
一个类似的问题已经在 Ordering of reflection requests in dotnet 中提出。但我希望能得到不同的答案...... 我正在为一个使用反射来查询插件以查找入口点的程序编写插件。不幸的是,它存在一个错误,如果在这个过程中遇到接口声明,它会崩溃并显示未处理的异常。我已经与开发团队交谈过,这个问题不太可能被修复。由于明显的原因,这对我非常限制。我已经想到了一个解决方法,就是让我的程序集加载另一个包含接口的程序集,但由于某些原因,这不是一个好的解决方案。很长时间以后,我才遇到了这个问题,因为由于某种原因,我的入口类总是在反射枚举顺序中先于我的接口。

我的问题是,是否有任何方法可以影响程序集中类和接口的排序?

注意:我已经尝试设置不同的接口可访问级别,但这对我没有用。


8
我已经与开发团队交流过,他们认为这个问题不太可能被修复。 - 为什么?在我看来,它需要被修复!只要告诉他们修复它!如果你不修复它,你只是在治疗症状而不是病因。 - Mitch Wheat
1
你确定这是框架中的错误吗,还是你在访问对接口不适用的“Type”成员?我为自己的插件系统编写了类似的程序集遍历代码,并没有遇到任何这样的问题。 - Bradley Smith
@Bradley 显然他并不拥有汇编遍历代码...这就是为什么他在寻找解决方法。 - Ondrej Tucny
你应该告诉他们修复那段代码,我也写了一个插件系统,可以从外部程序集中加载类和接口,并且运行良好。所以你应该解决根本原因,而不是症状。 - Iñaki Elcoro
@Mitch Wheat:这并不意味着什么——开发团队可能会失去联系,拥有严格的开发周期,代码版本可能已经过时等等。 - Ondrej Tucny
显示剩余5条评论
1个回答

2
我敢打赌,代码使用AppDomain.GetAssemblies(),然后对其进行检查。实现AppDomain.GetAssemblies()会导致一个外部方法,因此Reflector在这里基本上无法提供帮助。
但是,在没有实际尝试和检查结果的情况下,有两个逻辑选项可用于结果中程序集的排序:
1.加载顺序 2.字母顺序
在第一种情况下,您可能必须在您的程序集和加载顺序之间组织引用,以便外部代码找到具有入口点类的正确程序集并停止。在第二种情况下,它将纯粹地取决于以“正确”方式命名程序集,但我怀疑这不是这种情况。
(但是,顺序可能与上述两个完全不同,例如“大多数”随机化。)
无论哪种情况,我认为迟早有错误的代码将遇到有问题的程序集并崩溃。因此,强烈建议:坚持修复错误。

+1 给你,特别是那句“坚持修复错误”的部分! - Mitch Wheat
谢谢您提供的信息,但我需要影响程序集中类/接口的顺序,而不是程序集的排序。有时(我不知道为什么),编译器会将我的主类放在接口之前,有时则是接口先出现... - Jack Allan

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