late binding .net & com+

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

late binding .net & com+

Сообщение папа Карло »

наваял на .NET com+ компонент с парой методов. зарегистрил его с помощью regsvcs my.dll

пытаюсь его "дернуть" через Reflection:

Код: Выделить всё

			try
			{
				Type typeOOO = Type.GetTypeFromProgID("Small.Test");

				object o = Activator.CreateInstance(typeOOO);
			}
			catch(Exception ex)
			{
				Console.WriteLine(ex.ToString());
			}
получаю ошибку "System.TypeLoadException: Exception from HRESULT: 0x80131522."

Валится на Activator.CreateInstance

Что не так делаю?

Спасибо.
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Re: late binding .net & com+

Сообщение ajkj3em »

папа Карло писал(а):наваял на .NET com+ компонент с парой методов. зарегистрил его с помощью regsvcs my.dll

пытаюсь его "дернуть" через Reflection:

Код: Выделить всё

			try
			{
				Type typeOOO = Type.GetTypeFromProgID("Small.Test");

				object o = Activator.CreateInstance(typeOOO);
			}
			catch(Exception ex)
			{
				Console.WriteLine(ex.ToString());
			}
получаю ошибку "System.TypeLoadException: Exception from HRESULT: 0x80131522."

Валится на Activator.CreateInstance

Что не так делаю?

Спасибо.
это намек .. to stay away from this piece of sheeeet

;)
Аватара пользователя
Cool Man
Частый Гость
Сообщения: 13
Зарегистрирован: 17 фев 2003, 15:41

Сообщение Cool Man »

Неправильной стороной бутерброд держишь, кот Матроскин :lol:

Type.GetTypeFromProgID возвращает тебе информацию о типе COM класса, который нельзя напрямую использовать в .NET без Runtime Callable Wrapper.

Убери строчку с Type.GetTypeFromProgID (информация типа тебе здесь не нужна) и замени вызов Activator.CreateInstance на перегруженную версию, которая принимает две строки: Assembly Name и Type Name. Этого должно быть достаточно. Если опять ошибка появляется, проверь правильность Assembly name и Type Name, и еще можешь посмотреть чтобы твой ассембль был зарегистрирован в GAC (Regsvcs должен делать это).
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

про вропер я думал, а так ли он необходим если СОМ+ ДЛЛка была на дот нете писана?
Аватара пользователя
Cool Man
Частый Гость
Сообщения: 13
Зарегистрирован: 17 фев 2003, 15:41

Сообщение Cool Man »

Дело в том, что ты используешь GetTypeFromProgID, которая возвращает информацию типа именно COM класса по ProgID. Но напрямую инстанциировать COM объект используя эту информацию типа ты не можешь. И ты прав, в твоем случае необходимости в этом нет. Ты должен использовать стандартные средства создания объектов .NET, в частности используя перегруженный метод CreateInstance с параметрами имен Assembly и класса.

Успехов в деле освоения новых технологий. :wink:
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

Кулыч, у тебя книга есть как в дот нете принято познее связывание делать вообще и с компонентами в частности? Если есть, дай главу посмотреть на вечер? :)
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

Вроде заборол... Надо было ассемблю отправить в GAC. Кулыч, от книжки все равно не откажусь. :)
Аватара пользователя
Cool Man
Частый Гость
Сообщения: 13
Зарегистрирован: 17 фев 2003, 15:41

Сообщение Cool Man »

У меня к сожалению специальной книжки про это нет, но вообще я очень рекомендую "Applied Microsoft .NET Framework Programming"
by Jeffrey Richter. В этой книжке эта и подобные темы излагаются in depth.

Если не секрет, как выглядит этот код в окончательном рабочем виде? Просто интересно, каким образом эта задачка решена.

Успехов :)
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

все просто как в аптеке:

Код: Выделить всё

			try
			{
				Type t = Type.GetTypeFromProgID("Test.Component");

				object o = Activator.CreateInstance(t);

				object[] parameters = { "str1", "str2"};

				object c = t.InvokeMember( "TestMethod", BindingFlags.InvokeMethod, null, o, parameters);

				o = null;
			}
			catch(Exception ex)
			{
				Console.WriteLine(ex.ToString());
			}
т.е. все как и в примере было... не работало у меня потому как просто не находилась ассембли... после того как написан СОМ+ компонент который потом дергаем через рефлекшен надо с этим компонентом сделать следующие:

Код: Выделить всё

gacutil /i mycomponent.dll
regsvcs mycomponent.dll
типа вот так :)
Аватара пользователя
Cool Man
Частый Гость
Сообщения: 13
Зарегистрирован: 17 фев 2003, 15:41

Сообщение Cool Man »

То что ассембль не был в GAC как-то странно, потому что regsvcs должен был его загеристрировать согласно MSDN. Ну да ладно, теперь буду знать - у меня честно говоря были сомнения что regsvcs это делает и как я вижу небезосновательные.

Касаемо GetTypeFromProgID я все-таки не понимаю вашего глыбокого замысла, Иван Иванович. Что такое "Test.Component"? Ты компонент на COM писал или на .NET?
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

Это COM+ компонент писаный на C#.
Аватара пользователя
YoYo
Частый Гость
Сообщения: 23
Зарегистрирован: 10 апр 2003, 16:51
Откуда: Richmond Hill, ON
Контактная информация:

Сообщение YoYo »

Cool Man писал(а):У меня к сожалению специальной книжки про это нет, но вообще я очень рекомендую "Applied Microsoft .NET Framework Programming"
by Jeffrey Richter. В этой книжке эта и подобные темы излагаются in depth.
Правильная книжка и одна из лучших!!!
Аватара пользователя
Cool Man
Частый Гость
Сообщения: 13
Зарегистрирован: 17 фев 2003, 15:41

Сообщение Cool Man »

Тогда получается, ты вызываешь методы своего компонента через Runtime Callable Wrapper (regsvcs его автоматически создает и регистрирует как COM класс). Что-то меня одолевают смутные сомнения, что это самый эффективный метод. Не лучше ли делать это напрямую?

Это так, информация к размышлению. :wink:
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

напрямую? задача как раз: ничего не знаю про ассембли, а знаю только ProgId и имя метода. и все.
Ответить