2009-10-12 68 views
-1

我想創建應該作爲使用C#的進程進行啓動的COM服務器。我使用COM interop支持嘗試了控制檯應用程序,客戶端可以創建我的服務器的COM對象並調用COM對象的方法。但我的服務器沒有啓動作爲進程(如out out server),也沒有調用我的服務器應用程序的main()函數。具有COM introp支持的C#控制檯應用程序

我需要創建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(); 

感謝,

+0

你有迄今爲止所做的一些代碼示例嗎? – 2009-10-12 12:25:23

+0

凱爾,我更新了我的代碼示例 – santhosh 2009-10-12 12:38:55

回答

1

你要麼需要註冊COM組件t在COM +中,或者您需要通過單獨的任務啓動您的服務器。就其本身而言,COM不會在進程外服務器中創建對象。