【问题标题】:Checking Mono.Cecil and Mono.Cecil.Cil检查 Mono.Cecil 和 Mono.Cecil.Cil
【发布时间】:2012-03-13 16:07:21
【问题描述】:

我有一些代码可以加载一个 exe 文件并向用户显示其 CIL 代码。为此,我使用 Mono.Cecil 和 Mono.Cecil.Cil。

现在我想做一些不同的事情:我想知道用户的系统中是否有 Mono.Cecil 和 Mono.Cecil.Cil。为此,我想将 Reflection.Assembly.Load 与 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.Cecil.Cil。我没有正确使用 Assembly.Load 吗?如果是这种情况,有人可以告诉我如何使用 Assembly.Load 来加载 Mono.Cecil 和 Mono.Cecil.Cil 而无需寻找路径(制作仅在 Windows 或 GNU/Linux 下使用的 exe 文件单声道)?

注意:我在 Linux Mint 下使用 MonoDevelop 2.6 或在 Windows 7 下使用 MonoDevelop 2.8。

【问题讨论】:

  • 您的意思是要查明 Cecil 是否在 Global Assembly Cache 中?

标签: c# .net monodevelop mono.cecil assembly.load


【解决方案1】:

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

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

更多关于如何使用 CLR Probes for Assemblies 的信息可以在这里找到:http://msdn.microsoft.com/en-us/library/aa720133.aspx

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 2018-06-17
    • 2021-10-09
    • 1970-01-01
    • 2011-08-06
    • 2011-06-22
    • 2012-09-27
    相关资源
    最近更新 更多