2013-07-22 9 views
0

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

После создания объекта (через активатор или конструкторИнформация, я прочитал аргументы для обоих, но использовал активатор как более короткий, например), я должен использовать его, но это не работает.

Например:

Server instance; 

public void A() 
{ 
    Assembly loaded = Assembly.LoadFrom("C:\Program Files\test2\Shared.dll"); 
    serverType = loaded.GetType("Server"); 
    object obj = Activator.CreateInstance(serverType, new [] { "test" }); 
    instance = (Server)obj; 
} 

public void B() 
{ 
    instance.startServer(); 
} 

Это дает исключение:

System.InvalidCastException: [A]Server cannot be cast to [B]Server. 
    Type A originates from 'Shared, Version=0.0.0.0, Culture=neutral,  
    PublicKeyToken=2a032d22a4688508' in the context 
    'LoadFrom' at location 'C:\Program Files\test1\Shared.dll'. 
    Type B originates from 'Shared, Version=0.0.0.0, Culture=neutral, 
    PublicKeyToken=2a032d22a4688508' in the context 'Default' at location . 
    'C:\Program Files\test2\Shared.dll' 

Я понимаю причину исключения брошенного, но есть способ бросить экземпляр в качестве сервера из тип, который я хочу, то есть динамически загруженную dll?

+0

«Сервер» в вашем коде отличается от «Server» от 'test.dll'? или оба указывают на один и тот же тип? –

+0

К сожалению, я пытался сократить код, отредактировал для удаления test.dll и теперь пытается загрузить с нужного места – user1584120

+0

Я думаю, вы не поняли мой вопрос. Сервер в вашем коде отличается от «Server» от Shared.dll? или оба указывают на один и тот же тип? –

ответ

0

На этой строке: instance = (Server)obj; вам необходимо указать полное имя типа сервера.

В сборке вы запускаете этот код, probably присутствует другой тип Server, поэтому компилятор пытается разрешить эту двусмысленность, выбрав локальный. Вам нужно указать, что вы собираетесь отличить от Server класс или любые другие конкретные, например: NAMESPACE.TYPE_NAME

+0

в моем случае они имеют одинаковое пространство имен, поскольку они на самом деле являются точным одним и тем же классом и в той же самой сборке, только в другом месте. Мне нужно использовать dll в другом месте, так как там я использую путь сборки, чтобы получить путь для запуска другого exe. – user1584120

+0

Что означает «другое место»? – Tigran

+0

Я имел в виду, что одна и та же DLL находится в двух разных местах. Я создаю некоторые плагины для другого приложения, и они разделяют некоторые сборки. – user1584120

Смежные вопросы