Type.GetTypeFromProgID возвращает тебе информацию о типе COM класса, который нельзя напрямую использовать в .NET без Runtime Callable Wrapper.
Убери строчку с Type.GetTypeFromProgID (информация типа тебе здесь не нужна) и замени вызов Activator.CreateInstance на перегруженную версию, которая принимает две строки: Assembly Name и Type Name. Этого должно быть достаточно. Если опять ошибка появляется, проверь правильность Assembly name и Type Name, и еще можешь посмотреть чтобы твой ассембль был зарегистрирован в GAC (Regsvcs должен делать это).
Дело в том, что ты используешь GetTypeFromProgID, которая возвращает информацию типа именно COM класса по ProgID. Но напрямую инстанциировать COM объект используя эту информацию типа ты не можешь. И ты прав, в твоем случае необходимости в этом нет. Ты должен использовать стандартные средства создания объектов .NET, в частности используя перегруженный метод CreateInstance с параметрами имен Assembly и класса.
Кулыч, у тебя книга есть как в дот нете принято познее связывание делать вообще и с компонентами в частности? Если есть, дай главу посмотреть на вечер?
У меня к сожалению специальной книжки про это нет, но вообще я очень рекомендую "Applied Microsoft .NET Framework Programming"
by Jeffrey Richter. В этой книжке эта и подобные темы излагаются in depth.
Если не секрет, как выглядит этот код в окончательном рабочем виде? Просто интересно, каким образом эта задачка решена.
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());
}
т.е. все как и в примере было... не работало у меня потому как просто не находилась ассембли... после того как написан СОМ+ компонент который потом дергаем через рефлекшен надо с этим компонентом сделать следующие:
То что ассембль не был в GAC как-то странно, потому что regsvcs должен был его загеристрировать согласно MSDN. Ну да ладно, теперь буду знать - у меня честно говоря были сомнения что regsvcs это делает и как я вижу небезосновательные.
Касаемо GetTypeFromProgID я все-таки не понимаю вашего глыбокого замысла, Иван Иванович. Что такое "Test.Component"? Ты компонент на COM писал или на .NET?
Cool Man писал(а):У меня к сожалению специальной книжки про это нет, но вообще я очень рекомендую "Applied Microsoft .NET Framework Programming"
by Jeffrey Richter. В этой книжке эта и подобные темы излагаются in depth.
Тогда получается, ты вызываешь методы своего компонента через Runtime Callable Wrapper (regsvcs его автоматически создает и регистрирует как COM класс). Что-то меня одолевают смутные сомнения, что это самый эффективный метод. Не лучше ли делать это напрямую?