Страница 1 из 1

late binding .net & com+

Добавлено: 13 апр 2003, 19:53
папа Карло
наваял на .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

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

Спасибо.

Re: late binding .net & com+

Добавлено: 14 апр 2003, 00:00
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

;)

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

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

Убери строчку с Type.GetTypeFromProgID (информация типа тебе здесь не нужна) и замени вызов Activator.CreateInstance на перегруженную версию, которая принимает две строки: Assembly Name и Type Name. Этого должно быть достаточно. Если опять ошибка появляется, проверь правильность Assembly name и Type Name, и еще можешь посмотреть чтобы твой ассембль был зарегистрирован в GAC (Regsvcs должен делать это).

Добавлено: 14 апр 2003, 19:15
папа Карло
про вропер я думал, а так ли он необходим если СОМ+ ДЛЛка была на дот нете писана?

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

Успехов в деле освоения новых технологий. :wink:

Добавлено: 15 апр 2003, 15:28
папа Карло
Кулыч, у тебя книга есть как в дот нете принято познее связывание делать вообще и с компонентами в частности? Если есть, дай главу посмотреть на вечер? :)

Добавлено: 15 апр 2003, 16:14
папа Карло
Вроде заборол... Надо было ассемблю отправить в GAC. Кулыч, от книжки все равно не откажусь. :)

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

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

Успехов :)

Добавлено: 15 апр 2003, 19:39
папа Карло
все просто как в аптеке:

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

			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
типа вот так :)

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

Касаемо GetTypeFromProgID я все-таки не понимаю вашего глыбокого замысла, Иван Иванович. Что такое "Test.Component"? Ты компонент на COM писал или на .NET?

Добавлено: 15 апр 2003, 23:11
папа Карло
Это COM+ компонент писаный на C#.

Добавлено: 16 апр 2003, 05:09
YoYo
Cool Man писал(а):У меня к сожалению специальной книжки про это нет, но вообще я очень рекомендую "Applied Microsoft .NET Framework Programming"
by Jeffrey Richter. В этой книжке эта и подобные темы излагаются in depth.
Правильная книжка и одна из лучших!!!

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

Это так, информация к размышлению. :wink:

Добавлено: 16 апр 2003, 10:03
папа Карло
напрямую? задача как раз: ничего не знаю про ассембли, а знаю только ProgId и имя метода. и все.