在Mono中运行时,如何防止引用某个程序集

时间:2009-10-28 20:24:31

标签: c# mono assemblies

我知道如何基于Mono(Type.GetType(“Mono.Runtime”)!= null)分支代码,但即使采用Mono代码路径,Mono也会尝试加载程序集所需的程序集。非单声道代码路径。这并不奇怪,但我该如何解决这个问题呢?我已经尝试将调用非Mono程序集放在另一个类中,但这没有帮助。

4 个答案:

答案 0 :(得分:2)

直接这样做的唯一选择就是我一直可以看到的反射。

我建议采用更迂回的方法:将依赖Mono或.NET的所有代码重构为单独的程序集,每个平台一个 - 让我们称之为MA和NA。确保类的整个API表面都包含在公共接口中,这些接口应位于第3个程序集IA中。之后,您的主应用程序引用IA作为接口,并使用Reflection只加载一次MA或NA,具体取决于它是在Mono还是.NET上运行,并获取“顶级工厂类”的实例。在那里,它只是通过IA接口使用普通调用来通过该工厂实例化所有其他对象并使用它们。

答案 1 :(得分:1)

扩展Pavel的答案,您可以使用插件框架来帮助加载特定于平台的代码位的条件。您可以使用Mono.Addins或MS自己的开源Managed Extensibility Framework,称为MEF(http://www.codeplex.com/MEF

答案 2 :(得分:0)

不要在命令行编译器选项中添加引用。如果您使用的是高级IDE工具,则可能必须使用其项目设置来实现相同的功能。 还有其他文件可以像AssemblyInfo.cs一样发挥作用,并且可能包含有关您正在考虑的程序集的说明。该程序也可能使用App.Config(配置文件)或Web.Config(ASP.NET)/动态类型加载中的类型。

答案 3 :(得分:0)

不要依赖于您的代码是JITted并且只有被调用的代码是JIT的事实。

最好总是假设,所引用的内容都将被加载并且必须可用。 您可以选择使用AOT,这是Mono与NGEN的对应物。 或者新的运行时版本如何处理序列化,远程处理,安全性,反射等等的细微差别可能导致您的引用被加载,即使您的代码不直接使用任何东西。 (但序列化程序可能已经拉出所有类型,然后加载其他程序集)

使用接口或经典继承,或者事件或其他间接方式,只有在适当的情况下才能加载.Net部件。戴帽子的意思是你没有引用但是动态加载的程序集。