2009-06-15 4 views
3

Я пытаюсь использовать Assembly.Load() для загрузки сборки, которая находится в GAC. Например, скажите, что я хочу перечислить все типы, которые существуют в PresentationCore.dll, как бы я мог загрузить PresentationCore.dll?Как загрузить сборку из GAC?

Когда я пытаюсь это:

Assembly a = Assembly.Load("PresentationCore.dll"); 

Я получаю FileNotFoundException. Another answer on SO предложил использовать Assembly.LoadFrom() для выполнения этого - я не решаюсь это сделать, потому что Assembly.LoadFrom() устарел, согласно Visual Studio 2008 - плюс, похоже, что он действительно не работает.

Любые идеи?

ответ

11

Если сборка находится в GAC, вы должны загрузить ее через свое полное имя.

Например, если бы я хотел, чтобы загрузить mscorlib.dll я хотел бы сделать что-то вроде этого:

Assembly a = Assembly.Load 
    ("mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); 

Самый простой способ определить полное имя сборочной является, чтобы загрузить сборку в Reflector и использовать Имя поле из нижней панели дисплея, как это:

http://i42.tinypic.com/2m30ocn.png

+0

Отлично, спасибо! –

5

Вам нужно передать имя узла в Assembly.Load(), а не имя DLL. Если вы откроете DLL в Reflector, имя должно быть в нижней части окна. В случае с PresentationCore.dll имя должно быть чем-то вроде PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.

+2

+1 хорошая точка - это логическое имя сборки - не физическое имя файла - это необходимо –

3

Я рекомендую вам взглянуть на How the Runtime Locates Assemblies в библиотеке MSDN, чтобы получить представление о том, что происходит, когда CLR пытается загрузить сборку.

Для диагностики конкретных проблем инструмент Fusion Log Viewer является фантастическим. Сюзанна Кук, один из разработчиков Fusion, имеет в своем блоге guide, который помог мне в прошлом.

1

Самый простой способ, чтобы получить строку, чтобы сначала добавить ссылку на свой проект, то сделать это:

string regStringMath = typeof(System.Math).Assembly; 
Assembly assMath = Assembly.Load("System.Math", regStringMath); 

string regStringPres = typeof(PresentationCore).Assembly; 
Assembly assPres = Assembly.Load("PresentationCore", regStringPres); 

Это позволит вам получить правильную версию, которая была добавлена ​​в качестве ссылки на ваш проект.

+0

haha, 'assMath' – Jonesopolis

Смежные вопросы