2015-03-05 2 views
7

Я пытаюсь создать экземпляр класса, реализованного в плагине .dll в моем проекте, чтобы сделать открытие типа. Я получаю это исключение:Activator.CreateInstance: Не удалось загрузить тип из сборки

Не удалось загрузить тип 'Действие' из сборки 'SquidReports.DataCollector.Plugin.BES, Version = 1.0.0.0, Culture = нейтрален, PublicKeyToken = нуль.

Это точный метод подписи я использую: https://msdn.microsoft.com/en-us/library/d133hta4(v=vs.110).aspx

Другими словами, я пытаюсь породить объект, основанный на имени Ассамблеи и имя класса, например, так:

Важно отметить, что я использую «короткое» название сборки, а не «полное» имя (включая Version, Culture и PublicToken). Однако MSDN ясно сказано:

«AssemblyName» может быть одним из следующих способов: простое имя в сборки, без пути или расширения файла.

  • Например, вы бы указать TypeExtensions для сборки, путь и имя . \ Bin \ TypeExtensions.dll.

  • Полное имя подписанной сборки, которое состоит из простого имени, версии, культуры и токена открытого ключа; , например, «TypeExtensions, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 181869f2f7435b51».

В частности, я пытаюсь создать экземпляр класса «Action», определенной в «SquidReports.DataCollector.Plugin.BES» Ассамблеи. Я прямо ссылаюсь на эту сборку как , используя директиву в верхней части того же * .cs файла, где я пытаюсь создать экземпляр.

Я попытался следующие предложения из предыдущих вопросов/ответов:

вычистить свое решение, восстановить и попытайтесь снова Это похоже на работу в некоторых проектах ASP.NET, но это обычная старая консоль приложение.

Проверьте ссылки сборки в файле конфигурации Опять же, это простая консоль приложение, которое использует только GAC и библиотеки в разных проектах одного и того же раствора

1. Убедитесь, что сборка в правильный рабочий каталог:

Здесь мы ...

It's right there!!!

2.Убедитесь, что сборка и та же версия на диске

Угу ...

Looks the same

3. Заключительная рекомендация использовать fuslogvw.exe.

У меня нет опыта использования этого инструмента, но есть одна вещь, которую я нашел странно. После запуска сеанса отладки, как давно назвали и короткое название версия моей сборки обнаружилась:

Hmmm...

Я посмотрел на оба журналах.

Короткое название версии, похоже, предупреждения об ошибках:

=== Информация о состоянии Pre-связывать ===

LOG: DisplayName = SquidReports.DataCollector.Plugin.BES Частичное) WRN: Информация о частичной привязке была предоставлена ​​для сборки:

WRN: Название сборки: SquidReports.DataCollector.Plugin.BES | Идентификатор домена: 1

WRN: Частичная привязка возникает, когда предоставляется только часть отображаемого имени сборки.

WRN: Это может привести к тому, что связующее загрузит неправильную сборку.

ПРПЖД: Рекомендуется, чтобы обеспечить полностью указанную текстовую идентичность для сборки,

ПРПЖД: который состоит из простого имени, версии, культура и маркер открытого ключа.

WRN: Дополнительную информацию и общие решения по этой проблеме см. В техническом документе http://go.microsoft.com/fwlink/?LinkId=109270.

... но заканчивается время успешно загружен, и он ясно упоминает мою сборку в правильном месте:

LOG: Попытка загрузки нового файла URL: /// C:/Source /C#/SquidReports/SquidReports.DataCollector/bin/x86/Debug/SquidReports.DataCollector.Plugin.BES.DLL.

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

Больше идей?

EDIT: Ниже приведено минимальное определение класса Action. Это чисто модельный класс.

public class Action : ICollectible 
{ 
    public Action() 
    { 
     // Empty constructor 
    } 

    public Action(int actionID, string siteID, string name) 
    { 
     this.ActionID = actionID; 
     this.SiteID = siteID; 
     this.Name = name; 
    } 

    public int ID   { get; set; } // Identity ID assigned by DB 
    [Key] 
    public int ActionID  { get; set; } // Identity ID assigned by API 
    public string SiteID { get; set; } 
    public string Name  { get; set; } 
} 

ICollectable interface и [Key] атрибут являются частью еще одной сборки. Не уверен, что это повлияет?

EDIT 2: Как указывает Эрик, очевидно, что я сделал точные проверки и на этой другой сборке.

+0

Можете ли вы опубликовать минимальное определение типа 'Action'? –

+0

Имеет ли 'Action' статический конструктор? Это может вызвать исключение. Если это так, это должно быть найдено в свойстве InnerException для исключения, сообщение которого вы указываете выше. Даже если это не проблема, в InnerException может быть что-то еще, что может помочь вам понять это. – phoog

+0

Вы абсолютно уверены, что тип находится в этой DLL ?. Разберитесь с помощью il dissassembler и взгляните на типы, содержащиеся в DLL, или используйте отражатель (или другой инструмент) – brumScouse

ответ

8

Как вы узнали, сборка загружается, она просто не может найти тип (Action). Вы должны указать полное имя типа, Namespace.Action для .NET, чтобы найти его.

+0

Правильно ли я понимаю вас в предположении, что мне нужно будет указать «SquidReports.DataCollector.Plugin.BES. Model.Action 'вместо «Action» в качестве второго аргумента Activator.CreateInstance? Почему это? В указанной сборке существует только один класс Action. –

+0

@RobinMattheussen Пространство имен должно быть предоставлено, если пространство имен по умолчанию для сборки по умолчанию не совпадает с пространством имен вашего типа. т. е. попробуйте Model.Action – Eric

+0

@RobinMattheussen Да, 'Activator.CreateInstance' не будет проверять, существует ли только один тип с этим именем и поэтому всегда требует его полного имени. @Eric Является ли пространство имен по умолчанию хранимым где угодно в скомпилированной версии сборки? Я думал, что это просто проект Stones для Visual Studio. –