Проверка Mono.Cecil и Mono.Cecil.Cil
У меня есть некоторый код для загрузки исполняемого файла и показывает его код 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 ответ
Похоже, вы неправильно понимаете, что делает 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 Probes для сборок можно найти здесь: http://msdn.microsoft.com/en-us/library/aa720133.aspx
Именно поэтому Assembly.LoadWithPartialName() существует, но она устарела.