具有COM introp支持的C#控制台应用程序

时间:2009-10-12 12:21:55

标签: c# com

我想创建COM服务器,应该使用C#作为进程进行语言管理。我尝试使用COM互操作支持控制台应用程序,客户端可以创建我的服务器的COM对象并调用COM对象的方法。但我的服务器没有作为进程启动(如out process server),也没有调用我的服务器应用程序的main()函数。

我需要创建COM服务器作为单独的进程,以避免.net框架兼容性问题。

我的代码如下,

[Guid("321003E2-51E5-4acd-BC0E-3C9F42235748"),    InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface ITestInterface
{
    void PrintHi([In, MarshalAs(UnmanagedType.BStr)] string name);
}

[Guid("259689FE-58E4-4175-A82B-4E3827861767"), ProgId("MyTestApp.TestCom")]
public class TestCom : ITestInterface
{
    public TestCom()
    {
    }

    [ComRegisterFunction]
    public static void RegisterClass(string key)
    {
        StringBuilder strReg = new StringBuilder(key);
        strReg.Replace(@"HKEY_CLASSES_ROOT\", "");
        RegistryKey classReg = Registry.ClassesRoot.OpenSubKey(strReg.ToString(), true);
        classReg.Close();
    }

    [ComUnregisterFunction]
    public static void UnregisterClass(string key)
    {
        StringBuilder strReg = new StringBuilder(key);
        strReg.Replace(@"HKEY_CLASSES_ROOT\", "");
        RegistryKey classReg = Registry.ClassesRoot.OpenSubKey(strReg.ToString(), true);
        classReg.Close();
    }

    public void PrintHi(string name)
    {
        MessageBox.Show(name);
    }

}

和服务器主要功能,

public class Program
    {
        static void Main(string[] args)
        {
            MessageBox.Show("Server main called");
        }
    }

我的vc ++客户端,

   ITestInterface *cpi = NULL;
   HRESULT hr = CoInitialize(NULL);
   hr = CoCreateInstance(CLSID_TestCom, NULL, CLSCTX_ALL, IID_ITestInterface, (LPVOID *)&cpi);
   if (SUCCEEDED(hr))
   {
      cpi->PrintHi(_bstr_t("Test param"));
      cpi->Release();
      cpi = NULL;
   }
   CoUninitialize();

谢谢,

1 个答案:

答案 0 :(得分:1)

您需要在COM +中注册COM组件,或者需要通过单独的任务启动服务器。 COM本身不会在进程外服务器中创建对象。