Страница 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
Неправильной стороной бутерброд держишь, кот Матроскин
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 и класса.
Успехов в деле освоения новых технологий.

Добавлено: 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 класс). Что-то меня одолевают смутные сомнения, что это самый эффективный метод. Не лучше ли делать это напрямую?
Это так, информация к размышлению.

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