Использование Type.GetType () с несвязанной сборкой с Cassini / Visual Studio Dev. сервер - PullRequest
0 голосов
/ 25 февраля 2010

У меня есть код

var type = Type.GetType("namespace, assembly");
return Activator.CreateInstance(type);

, это нормально работает в большинстве ситуаций, однако, когда на этот код ссылаются в Global.asax веб-сайта, который отлаживается с помощью Cassini / Visual Studio Development Server, тип не может быть найден.

Тип находится в сборке, на которую нет ссылок, но обычно находится в том же выходном каталоге, что и исполняющая сборка. Однако при ближайшем рассмотрении выясняется, что во время отладки Cassini поместил исполняемую сборку и каждую ссылающуюся сборку в собственный каталог в следующем каталоге C: \ users ... \ AppData \ Local \ Temp \ Temporary ASP.NET Files \ root ... ... однако очевидно, что «не имеющая ссылки» сборка отсутствует.

Есть ли способ заставить VS скопировать дополнительные ресурсы во временный каталог или же запустить из указанного каталога? Является ли использование IIS единственным решением?

Спасибо заранее.

Ответы [ 2 ]

1 голос
/ 25 февраля 2010

Я думаю, что это не Кассини, это ASP.NET, использующий теневую копию .NET для предотвращения блокировки ваших DLL. Таким образом, использование IIS не должно ничего менять. Отсутствие явной ссылки, похоже, позволяет .NET помещать библиотеки DLL в разные каталоги.

Можете ли вы поместить эту библиотеку DLL в GAC?

0 голосов
/ 06 мая 2014

Это ответ на ваш комментарий к первому ответу («Есть ли у кого-нибудь еще возможные решения?») ...

Да, есть очень простое решение, и оно исходит из того же источника, который вызывает «проблему» (спойлер ... это System.AppDomain). В классе AppDomain есть событие с именем AssemblyResolve, на которое вы можете ответить (используйте AppDomain.CurrentDomain, чтобы получить «ваш» экземпляр AppDomain). Событие предоставит вам имя (строку) сборки, которую он не может найти. Я предполагаю, что вы знаете местоположение рассматриваемых сборок, поэтому просто используйте System.Reflection.Assembly.Load (pathToYourAssembly), чтобы загрузить сборку, а затем вернуть экземпляр сборки, который возвращает метод «Load». Обработчик событий AssemblyResolve немного отличается. Он имеет тип возврата, поэтому в вашем обработчике событий вы будете выполнять «return thisAssembly;» где thisAssembly - возвращаемое значение метода Load. AppDomain также имеет событие TypeResolve (и другие) на случай, если он не может найти тип в сборке, в которой он «должен быть». Это может произойти, если вы переместили тип из одной сборки в другую и не перекомпилировали все остальное, на которое ссылается этот тип. Во всяком случае, надеюсь, что это помогает кому-то. Я знаю, что это старый вопрос.

...