Я пытаюсь создать экземпляр класса, реализованного в плагине .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. Убедитесь, что сборка в правильный рабочий каталог:
Здесь мы ...
2.Убедитесь, что сборка и та же версия на диске
Угу ...
3. Заключительная рекомендация использовать fuslogvw.exe.
У меня нет опыта использования этого инструмента, но есть одна вещь, которую я нашел странно. После запуска сеанса отладки, как давно назвали и короткое название версия моей сборки обнаружилась:
Я посмотрел на оба журналах.
Короткое название версии, похоже, предупреждения об ошибках:
=== Информация о состоянии 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: Как указывает Эрик, очевидно, что я сделал точные проверки и на этой другой сборке.
Можете ли вы опубликовать минимальное определение типа 'Action'? –
Имеет ли 'Action' статический конструктор? Это может вызвать исключение. Если это так, это должно быть найдено в свойстве InnerException для исключения, сообщение которого вы указываете выше. Даже если это не проблема, в InnerException может быть что-то еще, что может помочь вам понять это. – phoog
Вы абсолютно уверены, что тип находится в этой DLL ?. Разберитесь с помощью il dissassembler и взгляните на типы, содержащиеся в DLL, или используйте отражатель (или другой инструмент) – brumScouse