Проверка Mono.Cecil и Mono.Cecil.Cil - PullRequest
1 голос
/ 13 марта 2012

У меня есть некоторый код для загрузки исполняемого файла и показывает его код 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с моно)?

Примечание : я работаю под Linux Mint с MonoDevelop 2.6 или под windows 7 с MonoDevelop 2.8.

1 Ответ

3 голосов
/ 14 марта 2012

Похоже, вы неправильно понимаете, что Assembly.Load делает для загрузки сборки.Я думаю, что вы пытаетесь найти, есть ли у пользователя Mono.Cecil в GAC.Проблема заключается в том, что при вводе частичного имени выполняется поиск только путей поиска текущего AppDomain, GAC используется только при указании полного имени.Это задокументировано здесь :

Не рекомендуется указывать частичное имя сборки для assemblyRef.(Частичное имя пропускает один или несколько маркеров языка, версии или открытого ключа. Для перегрузок, которые принимают строку вместо объекта AssemblyName, «MyAssembly, Version = 1.0.0.0» является примером частичного имени и «MyAssembly,Версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = 18ab3442da84b47 "является примером полного имени.) Использование частичных имен отрицательно влияет на производительность.Кроме того, частичное имя сборки может загружать сборку из глобального кэша сборок, только если в базовом каталоге приложения есть точная копия сборки (BaseDirectory или AppDomainSetup.ApplicationBase).

Дополнительная информацияо том, как CLR-зонды для сборок можно найти здесь: http://msdn.microsoft.com/en-us/library/aa720133.aspx

Именно поэтому существует Assembly.LoadWithPartialName () , но она устарела.

...