2009-10-12 14 views
-1

Je souhaite créer un serveur COM qui doit être déplacé en tant que processus utilisant C#. J'ai essayé l'application de console avec le support interop COM, le client peut créer l'objet COM de mon serveur et appeler la méthode des objets COM. Mais mon serveur n'est pas lancé en tant que processus (comme un serveur de processus), aussi la fonction main() de mon application serveur n'est pas appelée.Application de console C# avec prise en charge COM introp

J'ai besoin de créer un serveur COM en tant que processus séparé pour éviter le problème de compatibilité .net framework.

Mon code ci-dessous,

[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); 
    } 

} 

et serveur fonction principale,

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

Mon vC++ client,

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(); 

Merci,

+0

Avez-vous un exemple de code de ce que vous avez fait jusqu'à présent? –

+0

Kyle, j'ai mis à jour mon code – santhosh

Répondre

1

Soit vous devez enregistrer le Composant COM t dans COM +, ou vous devez lancer votre serveur via une tâche distincte. En soi, COM ne va pas créer un objet dans un serveur hors processus.

Questions connexes