COM-Interop



  • Hi,

    ich möchte in mein C++/CLI-Projekt eine COM-DLL einfügen und nutzen. Wenn ich ein C#-Projekt erstelle und diese DLL als Verweis angebe, so erstellt mir Visual Studio automatisch die entsprechenden Metadata.

    wie hier:

    using System;
    using System.Runtime.InteropServices;
    
    namespace EDMTYPESLib
    {
        [Guid("9AABCAE2-382A-4E6E-AEEA-B749EADF170D")]
        [TypeLibType(4160)]
        public interface IEDMRemote
        {
            [DispId(2)]
            [ComAliasName("EDMTYPESLib.EDMError")]
            EDMError LastError { get; }
            [DispId(1)]
            string Version { get; }
    
            [DispId(1610743823)]
            bool AddHistory(string Docnumber, string text);
            [DispId(1610743810)]
            bool Connect(string username, string password, string database);
            [DispId(1610743819)]
            bool DelDocument(string Docnumber);
            [DispId(1610743836)]
            IEDMReleaseReportCollection DocumentReleaseReports(string Docnumber);
            [DispId(1610743824)]
            bool FileAddReplace(string Docnumber, string filename, EDMFileType ftype, string rrpartnumber, short rrrevision, string Title, string Description);
            [DispId(1610743825)]
            bool FileDel(string Docnumber, string filename);
    
    ...
    etc.
    

    Nun kann ich im C#-Code ohne Probleme die Schnittstellenfunktionen nutzen und aufrufen. Wie z.B:

    private IEDMRemote m_Edm = null;
    
    m_Edm = (IEDMRemote)Activator.CreateInstance(Type.GetTypeFromProgID( "EDMADMIN.clsEDM" ));
    
    bool rc = m_Edm.Connect(username, password, database);
    ...
    

    Nun kann ich mit dem Objekt "m_Edm" alle Funktionen aufrufen, die mir die COM-DLL bereitstellt.

    Wenn ich nun versuche, diese DLL in ein C++/CLI Projekt zu integrieren, dann kann ich momentan noch überhaupt nicht auf die Funktionen zugreifen. Es wird, soweit ich das erkennen kann, auch keine Metadaten erstellt. Ich kann zumindest nicht drauf zugreifen. Ich habe versuche, die DLL über den Assisten

    Eigenschaftenseiten->Framework und Verweise->Neuen Verweis hinzufügen->Durchsuchen

    hinzuzufügen. Ist das prinzipiell falsch? Wie kann ich das COM-Interface in meinem C++ Code öffentlich machen? Habt ihr vll auch Beispielseiten, die mir zeigen, wie ich hier prizipiell vorgehen muss?

    Vielen Dank!



  • Warum verwendest Du die C# DLL nicht *direkt* in C++/CLI!? Warum COM?
    Oder ich hab es nicht ganz kapiert, was Du vorhast...



  • Kann ich denn die DLL einfach so nutzen? Also dann mit DLLImport oder wie?
    Wie ich schon versucht habe anzudeuten, wird diese DLL mittels Assembly-Verweis in einem C# Projekt eingebunden. Daher bin ich davon ausgegangen, dass ich ebenfalls in meinem C++/CLI Projekt die DLL auf gleicher Weise einbinden muss.

    Leider kenn ich mich in diesem Gebiet nicht so aus. Wie kann ich überhaupt erkennen, dass es sich um eine COM-DLL handelt?



  • Ich verstehe immer noch nicht WAS Du genau willst!



  • Wenn du eine COM-DLL hast, dann kannst du sowohl in C++ als auch C++/CLI einfach #import verwenden:
    http://msdn.microsoft.com/de-de/library/8etzzkb6.aspx

    Wenn es eine .NET DLL ist, dann referenzier' sie einfach ganz normal.


Anmelden zum Antworten