2012-04-01 11 views
1

ich erklärt habe C++/CLI-Klasse wie untenCoCreateInstance C++/CLI-Klasse von Native C++

namespace testcominterface { 

    [ComVisible(true)] 
    [Guid("FFCA805F-8DAB-4AF8-A7B7-B488136E8177")] 
    public interface class ITestInterface 
    { 
     public : 
      void TestMethod(); 
    }; 


    [ComVisible(true)] 
    [Guid("E65F4772-54B5-4105-83E5-DCED24ABC815")] 
    [ClassInterface(ClassInterfaceType::AutoDual)] 
    [ComDefaultInterface(ITestInterface::typeid)]  
    public ref class testCoClass : ITestInterface 
    { 
     public: 
      virtual void TestMethod() 
       { 

        Console::WriteLine("testCoClass::TestMethod : Test method"); 

       } 
    }; 
} 

Und ich die "testCoClass" durch native C++ COM erstellt werden soll (von # Import der TLB-Datei und verwendet CoCreateInstance) Ich bekomme immer einen Fehler "Class Not Registered". Wenn ich "Regasm.exe" verwende, um die Assembly zu registrieren, funktioniert es gut, aber ich möchte die Assembly nicht registrieren.

Ich habe die Schritte in diesem Blogpost http://blogs.msdn.com/b/cheller/archive/2006/08/24/how-to-embed-a-manifest-in-an-assembly-let-me-count-the-ways.aspx Embedded Manifest in die Assembly gefolgt, aber es hat nicht funktioniert. (Beachten Sie, dass diese Methode immer mit C# Montagearbeiten, aber dies ist eine C++/CLI Montage.

ich irgendwelche Vorschläge zu schätzen wissen.

Antwort

2

Ein COM-Server muss registriert werden, damit COM die DLL finden kann, wenn ein Client-Programm fragt nach dem. Technisch kann es vermieden werden, indem man dem Client-Programm ein Manifest mit reg-freien COM-Einträgen gibt, <clrClass> wird für COM-Server benötigt, die mit verwaltetem Code geschrieben sind Client, nicht der Server. Gehen Sie nicht dorthin, bis Ihr COM-Server ordnungsgemäß funktioniert.

Ein Standardfehler besteht darin, zu vergessen, die Option/codebase mit Regasm.exe zu verwenden. Ohne sie muss die Versammlung einen starken Namen haben und in den GAC aufgenommen werden. Das ist nichts, was Sie auf Ihrem Dev-Rechner machen wollen. Ein weiterer häufiger Fehler ist die Verwendung der falschen Version von Regasm.exe. Sie müssen auf die Bitterkeit auf einer 64-Bit-Maschine achten. Wählen Sie den richtigen aus, wenn Sie VS2010 verwenden und den GAC verwenden. .NET 4 hat einen anderen Speicherort für den GAC.

Sie sollten die Attribute verbessern, die Sie verwenden. Ein richtiger COM-Server macht nur die Schnittstellen verfügbar und verbirgt die Implementierung. Verwenden Sie [InterfaceType (ComInterfaceType :: InterfaceIsDual)] für die Schnittstellendeklaration und [ClassInterface (ClassInterfaceType :: None)] für die Klasse. Sie brauchen nun auch nicht mehr [ComDefaultInterface] und die Abhängigkeit der Typbibliothek von mscorlib.tlb ist weg.

Wenn Sie immer noch Probleme haben, kann das ProcMon-Dienstprogramm von SysInternals Ihnen genau zeigen, wo in der Registrierung der Client nach Ihrem Server gesucht und ihn mit den tatsächlichen Registrierungsstandorten verglichen hat, die Ihr Server verwendet.

+0

Ich habe die Attribute der Schnittstelle und der Klasse als Ihre Vorschläge behoben. Ich hatte die \t \t \t \t \t' Ich habe immer noch den gleichen Fehler. – Aing

+0

Es hat keinen Sinn, etwas in das Manifest des Servers zu schreiben. Windows kann es nicht lesen, bis die Server-DLL zuerst gefunden wird. Das Ei geht vor das Huhn, es ist der * Kunde *, der das Manifest braucht. Nochmals, gehen Sie nicht dorthin, bis Ihr Server ordnungsgemäß funktioniert, debuggen Sie ein Problem nach dem anderen. –

+0

Ich habe es gerade funktioniert, indem ich mein Client-vcxproj-Projekt so konfiguriert habe, dass die Manifest-Datei nicht eingebettet wird. Dann habe ich manuell myclient.exe erstellt, mit '' Verweis auf den COM-Server-Assemblynamen. Dann musste ich myclient.exe.config mit 'erstellen ' – Aing