Checking Mono.Cecil and Mono.Cecil.Cil



我有一些代码来加载exe文件,并向用户显示其CIL代码。要做到这一点,我使用Mono.Cecil和Mono.Cil.

现在我想做一些不同的事情:我想知道用户的系统中是否有Mono.Cecil和Mono.Cecl.Cil。要做到这一点,我想使用Reflection.Assembly.Load with Mono。Cecil和Mono.Cecil.Cil。类似于:

public void PrintInstr( ) {
    try
    {
        Reflect.Assembly mc = Reflect.Assembly.Load( "Mono.Cecil" );
        Reflect.Assembly mcc = Reflect.Assembly.Load( "Mono.Cecil.Cil" );
    }
    catch( Exception )
    {
        System.Console.WriteLine( ""Mono.Cecil" or "Mono.Cecil.Cil" not found " );
        return;
    }
    //[...]
}

但我只得到以下错误:

Could not load file or assembly 'Mono.Cecil' or one of its dependencies.
The system cannot find the file specified.

当然,我有Mono.Cecil和Mono.Cil.Cil。我是不是没有正确使用Assembly.Load?如果是这样的话,有人能告诉我如何使用Assembly.Load来加载Mono.Cecil和Mono.Cil.Cil而无需查找路径(制作一个在Windows或GNU/Linux下使用Mono的唯一exe文件)吗?

注意:我在Linux Mint和MonoDevelop 2.6下工作,或者在windows 7和MonoDevelopment 2.8下工作。

您似乎误解了Assembly.Load加载程序集的作用。我想你想找的是用户在GAC中是否有Mono.Cecil。问题是,当您提供部分名称时,只搜索当前AppDomain的搜索路径,而GAC仅在您提供全名时使用。这里记录了这一点:

不建议为assemblyRef提供部分程序集名称。(部分名称省略了区域性、版本或公钥中的一个或多个代币对于采用字符串而不是AssemblyName的重载对象,"MyAssembly,Version=1.0.0.0"是部分名称的示例和"MyAssembly,Version=1.0.0.0,Culture=neutral,PublicKeyToken=18ab3442da84b47"是全名的一个示例。)使用分部名称对性能有负面影响。此外部分程序集名称可以从全局程序集中加载程序集仅当中存在程序集的精确副本时才缓存应用程序基本目录(BaseDirectory或AppDomainSetup.ApplicationBase).

有关如何在此处找到程序集的CLR探测器的详细信息:http://msdn.microsoft.com/en-us/library/aa720133.aspx

这正是Assembly.LoadWithPartialName()存在的原因,但它已被弃用。

最新更新