Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка сборки 
V
    Опции темы
KAPJICOH
Дата 3.11.2007, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 18.4.2006

Репутация: нет
Всего: нет



Здраствуйте. Необходимо загрузить сборку в домен, при этом сборка не лежит в GAC и не находится в директории CurrentDomain.BaseDirectory. Вот так пытаюсь загрузить сборку:
Код

AppDomain domain = AppDomain.CreateDomain("ModuleScaning");
            if (domain == null)
                return null;
            AssemblyName an = AssemblyName.GetAssemblyName(@"c:\module\bin\moduleloader.dll");
            ModuleLoader loader = (ModuleLoader)domain.CreateInstanceAndUnwrap("moduleloader.dll", typeof(ModuleLoader).FullName);

Выскакивает экзепшн, что файл не найден, хотя AssemblyName загружает информацию о сборке.
PM MAIL   Вверх
tol05
Дата 3.11.2007, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Цитата(KAPJICOH @  3.11.2007,  18:37 Найти цитируемый пост)
Необходимо загрузить сборку в домен

KAPJICOH, а где ты грузишь сборку в домен? Если надо, так надо грузить, а ты этого не делаешь
Код

AppDomain domain = AppDomain.CreateDomain("ModuleScaning");
if (domain == null) return null;
AssemblyName an = AssemblyName.GetAssemblyName(@"c:\module\bin\moduleloader.dll");
//---------------------------------------------------------------------------------------------------------------------
domain.Load (an); 
//---------------------------------------------------------------------------------------------------------------------
ModuleLoader loader = (ModuleLoader)domain.CreateInstanceAndUnwrap("moduleloader.dll", typeof(ModuleLoader).FullName);

 smile 

и что-то не то вообще с domain.CreateInstanceAndUnwrap... нужно FullName сборки передавать. Посмотри в MSDN повнимательнее ... 


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
KAPJICOH
Дата 3.11.2007, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 18.4.2006

Репутация: нет
Всего: нет



Цитата(tol05 @ 3.11.2007,  19:55)
и что-то не то вообще с domain.CreateInstanceAndUnwrap... нужно FullName сборки передавать. Посмотри в MSDN повнимательнее ...

Ссори немного не точно выразился и не тот код отпостил). Необходимо получиь ссылку на объект созданный в другом домене. Для этого использую CreateInstanceAndUnwrap. Собственно говоря на этой стадии и вылетаю с исключением вот код:
Код

AppDomain domain = AppDomain.CreateDomain("ModuleScaning");
            if (domain == null)                return null;
            AssemblyName an = AssemblyName.GetAssemblyName(@"c:\module\bin\moduleloader.dll");
            ModuleLoader loader = (ModuleLoader)domain.CreateInstanceAndUnwrap(an.FullName, typeof(ModuleLoader).FullName);


PM MAIL   Вверх
tol05
Дата 3.11.2007, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Во-первых: я немного погорячился с 
Код

domain.Load (an); 

не нужно это, действительно ... уже подзабыл немного remoting ... 

но

Во-вторых. Ты в MSDN смотрел сигнатуры метода CreateInstanceAndUnwrap() ? 
Display name для сборки, не имеющей строгого имени будет "moduleloader". Но это не годится, т.к. loader будет искать сборку в каталоге программы и в GAС. 
А если сборка лежит в постороннем каталоге, то он ее просто не найдет. Поэтому попробуй использовать метод
Код

public Object CreateInstanceFromAndUnwrap (string assemblyName, string typeName)

Parameters
assemblyName
The name of a file that contains an assembly that defines the requested type. 

typeName
The fully qualified name of the requested type. 


ну и в-третьих: ты уже второй раз об исключении говоришь. А можно скопировать Message и Stack Trace этого исключения и запостить? Или нужно гадать, дебагать твой код у себя и имитировать все известные мне исключения?

короче, код ИМХО, будет таким:
Код

AppDomain domain = AppDomain.CreateDomain("ModuleScaning");
if (domain == null)                return null;
ModuleLoader loader = domain.CreateInstanceFromAndUnwrap(@"c:\module\bin\moduleloader.dll", typeof(ModuleLoader).FullName) as ModuleLoader;


Это сообщение отредактировал(а) tol05 - 3.11.2007, 23:34


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
KAPJICOH
Дата 4.11.2007, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 18.4.2006

Репутация: нет
Всего: нет



Цитата(tol05 @ 3.11.2007,  23:32)
ну и в-третьих: ты уже второй раз об исключении говоришь. А можно скопировать Message и Stack Trace этого исключения и запостить? Или нужно гадать, дебагать твой код у себя и имитировать все известные мне исключения?

Попробовал как ты сказал и получил вот такое исключение.
Код

Невозможно загрузить файл или сборку "c:\module\bin\moduleloader.dll" или один из зависимых от них компонентов. Данное имя сборки или база кода недействительны. (Исключение из HRESULT: 0x80131047)
[FileLoadException: Невозможно загрузить файл или сборку "c:\module\bin\moduleloader.dll" или один из зависимых от них компонентов. Данное имя сборки или база кода недействительны. (Исключение из HRESULT: 0x80131047)]
   System.AppDomain.CreateInstanceAndUnwrap(String assemblyName, String typeName) +0
   TechDream.CMS.Modules.ModulesManager.ModulesManager.ScanForModules() in c:\inetpub\wwwroot\TD_CMS\App_Code\Core\Modules\ModulesManager.cs:45
   _Default.Page_PreInit(Object sender, EventArgs e) in c:\inetpub\wwwroot\TD_CMS\Default.aspx.cs:22
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +34
   System.Web.UI.Page.OnPreInit(EventArgs e) +2052204
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +521


Это сообщение отредактировал(а) KAPJICOH - 4.11.2007, 15:04
PM MAIL   Вверх
KAPJICOH
Дата 4.11.2007, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 18.4.2006

Репутация: нет
Всего: нет



Цитата

Assembly.Load requires the full name, also known as the display name, of the
assembly, which is either its simple name (e.g. MyAssembly) without an
extension, or the fully qualified name, which consists of its simple name, a
version, a public key token, and its culture. For example,
Assembly.Load( "MyAsm, Version=1.0.1.220, Culture=Neutral,
PublicKeyToken=83b26e4166b7e1b8");

This also requires that the assembly be located either in the appdomain's
base directory, in a directory below there and which is one of the
components of the appdomain's PrivateBinPath, (so that the runtime knows how
to locate it), or specified in an app.config with a binding redirect and a
codebase hint. There are other places it can be located and mechanisms used
to tell the runtime how to find it, but these ought to get you started.
There are lots of options.

If you use Assembly.LoadFrom the the argument specified if the fully
specified path, either on the file system or to a url. This does not require
that the assembly be located in your appdomain's base directory, but it has
other limitations that can cause problems. Another major difference is that
the runtime internally stores loaded assemblies into multiple lists; the
Load context and the LoadFrom context (and others).

I've found it is usually better to use Load rather then LoadFrom because of
the way that the runtime locates and loads dependencies. If you use LoadFrom
you'll usually find it necessary to also subscribe to the
AppDomain.AssemblyResolve event to manually load dependencies of that
assembly.

I prefer to use a combination approach. I use:

AssemblyName an = AssemblyName.GetAssemblyName(filePath);
Assembly.Load(an);

This loads the filepath into the AssemlyName's codebase field and also
extracts all the other information from the assembly's manifest (version,
token, and culture). When you call Assembly.Load(an) the runtime tries to
load the assembly using the display name information, and if it can resolve
it it loads it into the Load context. If that fails it falls back to doing a
LoadFrom on the file path, loading it into the LoadFrom context.

Проблему решил. Спасиба.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0440 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.