Не удается получить экземпляр класса Type для типа, не определенного в текущей выполняемой сборке - PullRequest
2 голосов
/ 18 июля 2010

Как получить экземпляр класса Type для типа, не определенного в текущей выполняемой сборке или в mscorlib.dll?

a) А именно, я определил тип класса someType в сборке CSharpSnapIn.dll, расположенный в E:\CSharpSnapIn.dll, но по какой-то причине при попытке указать абсолютный путь к этой сборке я получаю исключение:

Type t = Type.GetType("someType, E:\\CSharpSnapIn.dll"); // exeception

b) Я также попытался поместить CSharpSnapIn.dll в каталог \bin\debug запущенного в данный момент приложения, но я все еще получаю исключение:

Type t = Type.GetType("someType, CSharpSnapIn.dll"); // exeception

* 1016 спасибо *

EDIT:

1) Я объявил другой тип класса someType2 (внутри CsharpSnapIn.dll), и на этот раз он работал:

Type.GetType("someType2, CSharpSnapIn");

Разница между someType и someType2 заключается в том, что someType реализует интерфейс, объявленный во внешней сборке asmIn, но это не должно вызывать исключение, так как CsharpSnapIn.dll имеет ссылку на asmIn? !

2)

Обратите внимание, что сборка не требуется быть загруженным первым, пока распознаватель сборок может найти его

Другими словами, вызов Type.GetType() сначала загружает сборку, а затем создает Type экземпляр?

3) * * тысяча сорок-пять

Сборка должна быть найдена зондирование, так что это должно быть в каталог бина согласно вашей второй пример. Если это сборка с сильное имя, вы должны дать все подробности.

То есть вы говорите, что мы не можем указать абсолютный путь (к сборке), используя Type.GetType(), но вместо этого сборка должна находиться в каталоге bin?

Ответы [ 2 ]

5 голосов
/ 18 июля 2010

Сначала необходимо загрузить сборку:

Type t = Assembly
    .LoadFrom(@"e:\CSharpSnapIn.dll")
    .GetType("SomeNs.SomeType", true);
4 голосов
/ 18 июля 2010

Вам нужно дать имя сборки , а не файл, который его содержит.

Например:

Type t = Type.GetType("someType, CSharpSnapIn");

Сборка должна быть найдена зондированием, поэтому она должна находиться в каталоге bin, как в вашем втором примере. Если это сборка со строгим именем, вы должны предоставить все детали. Обратите внимание, что someType здесь также должно быть полностью определено в терминах пространства имен.

Обратите внимание, что сборку не нужно загружать первой, если ее может найти распознаватель сборок. Например, если сборка находится в том же каталоге, что и текущая сборка, в большинстве случаев это будет нормально.

Как говорит Дарин, альтернативой является прямая загрузка сборки - хотя, по моему опыту, в загрузке сборок явно есть несколько "недочетов", особенно если у вас есть две сборки в разных местах, обе из которых зависят от третьей сборка. Удостовериться, что вы загружаете только третью сборку один раз, может быть сложно.

Вам нужно выбрать между LoadFile и LoadFrom и т. Д. Вот несколько замечаний из MSDN:

Используйте метод LoadFile для загрузки и изучить сборки, которые имеют одинаковые идентичности, но расположены в разных пути. LoadFile не загружает файлы в контекст LoadFrom, и делает не разрешать зависимости с помощью путь загрузки, как метод LoadFrom делает. LoadFile полезен в этом ограниченный сценарий, потому что LoadFrom не может быть использован для загрузки сборок, которые имеют одинаковые идентичности, но разные пути; он загрузит только первый такая сборка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...