Здравствуйте!!!
У меня такой вопрос. Может он кому-то покажется глупым, но
к сожалению я по этой тематике никак не могу нигде ничего
найти. Обьясняю суть проблемы.
Предположн у нас есть класс который хранится в dll библиотеке
и этот класс имеет какой либо интерфейс: Пример
////// Компилирую как dll /////////////////////////////////
using System;
using System.Collections.Generic;
using System.Text;
namespace MyInterfaceNameSpace
{
public interface MyInterface
{
int func1(int a);
int func2(int b);
}
}
namespace MyNameSpace
{
public class MyClass : MyInterfaceNameSpace.MyInterface
{
public int func1(int a){ return a; }
public int func2(int b){ return b; }
}
}
////////////////////////////////////////////////////////////
После чего я хочу эту библиотеку динамически подключить. То есть
не в Reference прописать путь к этой библиотеке и воспользоваться
ей а при помощи Assembly.LoadFile();
Пример:
/// сначала я также описываю интерфейс
public interface MyInterface
{
int func1(int a);
int func2(int b);
}
/// и потом пытаюсь сделать следующее
Assembly assembly;
Type type;
assembly =
Assembly.LoadFrom("ClassLibrary1.dll"); // путь к библиотеке
type = assembly.GetType("MyNameSpace.MyClass", true);
// и вот тут у я и не знаю что написать
// но я хочу привести мой класс к моему интерфейсу
// в абстракции это типа
// MyInterface mint = type as MyInterface;
// но так естественно не работает
Может быть я бьюсь в закрытую дверь и этого сделать невозможно!
DLL проблемка !!!
От:
Аноним
Дата:
19.02.06 21:58
Оценка:
Вам нужно assembly.GetType заменить на assembly.CreateInstance.
Здравствуйте, SergeyP, Вы писали:
SP>Вам нужно assembly.GetType заменить на assembly.CreateInstance.
Спасибо что ответили!!!
Если я вас правильно понял то я должен сделать следующее:
/////Сначала определяю интерфейс такой-же как в библиотеке/////////////
public interface MyInterface
{
int func1(int a);
int func2(int b);
}
/////Затем в тексте программы////////////////////////////////////
Assembly assembly;
Type type;
Object obj;
assembly = Assembly.LoadFrom("ClassLibrary1.dll");
obj = assembly.CreateInstance("MyNameSpace.MyClass");
MyInterface mint = obj as MyInterface;
////////////////////////////////////////////////////////////////
Но к сожалению так тоже не получается. Может я вас не правильно понял.
Спасибо за ваш ответ
Re[2]: DLL проблемка !!!
От:
Аноним
Дата:
20.02.06 23:57
Оценка:
Assembly assembly;
Type type;
Object obj;
assembly = Assembly.LoadFrom("ClassLibrary1.dll"); // OK
obj = assembly.CreateInstance("MyNameSpace.MyClass"); // OK
MyInterface mint = obj as MyInterface; // FALSE.
Nobody knows what it is 'MyInterface' ?
Or you use reflection( LoadAssembly... ) or reference of assemble to the project.
А>Assembly assembly; А>Type type; А>Object obj;
А>assembly = Assembly.LoadFrom("ClassLibrary1.dll"); // OK А>obj = assembly.CreateInstance("MyNameSpace.MyClass"); // OK А>MyInterface mint = obj as MyInterface; // FALSE.
А>Nobody knows what it is 'MyInterface' ? А>Or you use reflection( LoadAssembly... ) or reference of assemble to the project.
Я же в первом своем сообщении написал, что этот интерфейс одинаковым образом определен
и в библиотеке и в файле который эту библиотеку тянет.
Может я просто неправильно понимаю принцип работы интерфейсов.
Re: DLL проблемка !!!
От:
Аноним
Дата:
20.02.06 19:13
Оценка:
>... Если я вас правильно понял то я должен сделать следующее:
/////Сначала определяю интерфейс такой-же как в библиотеке/////////////
Нет, Вы должны одинраз описать interface и реализовывать его в классе, который подгружаете динамически и в самом приложении (в том, в которое загружаете), иначе у Вас получается два разных интерфейса.
>Нет, Вы должны один раз описать interface и реализовывать его в классе, который подгружаете динамически и в самом приложении (в том, в которое загружаете), иначе у Вас получается два разных интерфейса.
Я имел ввиду " ... и использовать в самом приложении ..."
Извините за полный бред который я написал в прошлый раз Просто я не видел ответов на этом
форуме, я был на форуме RSDN.
Теперь у меня возникает другой вопрос. А как правильно выдернуть интерфейс из подключаемой dll.
Я конечно извиняюсь за свои может быть глупые вопросы но к сожалению я действительно ничего толкового не могу найти по этой тематике.
Заранее спасибо.
> ... А как правильно выдернуть интерфейс из подключаемой dll. ...
У Вас должно быть как минимум 3 сборки: в сборке I Вы описываете interface, затем подключаете эту сборку в references сборки P(plugin) и сборки A (application), таким образом этот интерфейс будет доступен в compile time в обоих сборках.
Большое спасибо вы мне очень помогли!!!
А где вы черпаете знания по обьектному программированию на C#. Я ни разу не видел книг
с такой тематикой именно по C#.
_>А где вы черпаете знания по обьектному программированию на C#. Я ни разу не видел книг _>с такой тематикой именно по C#.
_>данное сообщение получено с www.gotdotnet.ru
Учимся пользоваться поиском на форуме RSDN
Подобные вопросы возникают с периодичностью в месяц, два.. и уже не раз обсосаны во всех доступных формах.