С регистрацией разобрался. Оказывается VS2005 уже все зделала сама. У меня ведь стоит галочка в настройках проекта "Register for COM interop"
Теперь другая пролема, с подключением.
//Описываю интерфейс
namespace TestComLib
{
[Guid("AD0DC746-F175-4b0b-B92B-03C2893498FC"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface ITestComponent
{
int Mul(int First, int Second);
int Square { get; set; }
String About { get; }
}
[ComImport, Guid("CBEB5433-002A-4fdf-AD04-E9BD9EEE604A")]
class TestComponent
{
}
..........
//Пытаюсь подключится
private void button3_Click(object sender, EventArgs e)
{
TestComLib.TestComponent tc = new TestComLib.TestComponent(); //Ошибка
TestComLib.ITestComponent ic = (TestComLib.ITestComponent)tc;
label1.Text = ic.About;
}
Текст ошибки:
Unable to cast object of type 'TestComLib.TestComponent' to type 'TestComLib.TestComponent'.
т.е. несовпадение типов или пространства имен. Как тогда правельно?
Через позднее связывание таже ошибка:
string sAppProgID = "TestComLib.TestComponent";
object oTestCom = null;
try
{ oTestCom = Marshal.GetActiveObject(sAppProgID); }
catch
{ oTestCom = Activator.CreateInstance(Type.GetTypeFromProgID(sAppProgID)); }
.................
//Этот метод проходит без проблем
label1.Text = (string) oTestCom.GetType().InvokeMember("About",
BindingFlags.GetProperty, null, oTestCom, null);
...................
//такой способ не проходит, а как раз его то и хотелось бы реализовать
TestComLib.TestComponent i = (TestComLib.TestComponent)oTestCom;
TestComLib.ITestComponent mc = (TestComLib.ITestComponent)i;
label1.Text = mc.About;