.idl in C#-Projekt nutzen

kk86

Grünschnabel
Hallo,

ich hoffe ihr könnt mir helfen.

Mein Problem, ich habe eine .idl, welche ich in ein c# Projekt einfügen möchte um dann über COM-CoClassen darauf zugreifen zu können.
Alles was ich bis jetzt im Internet darüber gelesen habe, hilft mir nicht wirklich weiter.

Was habe ich bis jetzt versucht:
idl. mit MIDL in eine .tlb umgewandelt: mit Express 2005 C++ funktioniert es, wenn ich die Konsole nutze erhalte ich folgenden Fehler:
Code:
midl : command line error MIDL1003 : error returned by the C preprocessor (4)
Ich habe auch schon versucht über /I die Pfade zu den verwendeten .tlb anzugeben aber bringt auch nichts.

Die von VC 2005 erzeugte, .tlb habe ich dann mit Hilfe des TlbImp.exe in eine dll umgewandelt. Diese habe ich dann versucht mit regsvr32.exe zu registrieren, dabei erhalte ich folgende Fehlermeldung:

Code:
Pfad/.dll wurde geladen, aber der DllRegisterServer-Eingangspunkt wurde nicht gefunden. 
Diese Datei kann nicht gefunden werden.

Ich weiß langsam wirklich nicht mehr weiter, und das ganze ist leider wichtig.

Wäre für jeden Tipp dankbar!
(Achso falls es wichtig sein sollte, ich verwende VS 2008 C# Express)

Grüße
 
Hi

Die von TlbImp generierte Assemlby ist eine Interop-Assembly. Ähnlich dem IDL nur eben für .NET.
Registriert werden muss weiterhin die eigentliche COM-Dll, aus der das IDL stammt.
 
Hi
erstrmal Danke für die Antwort, aber was kann ich machen, wenn ich die eigentliche COM-Dll nicht habe?
 
Hi

Für die Entwicklung musst du die Interop in deinem Projekt referenzieren.
Dann kannst du zwar kompilieren, deine Programm wird jedoch nur bis zum ersten Aufruf Richtung COM laufen. Da ist nun mal die Implementierung und die brauchst du nun mal
 
Also so ganz versteh ich deine Antwort nicht. Heißt dass, das ich ohne die eigentliche COM-Dll keine Möglichkeit habe das ganze zu nutzen?

Ich habe die dll, die ich aus der idl erzeugt habe (1. Beitrag) über Verweise hinzugefüg und über "using" eingebunden. Jetzt kann ich zwar auf die Interfaces zugreifen, aber eben keine Objekte erzeugen (ist ja auch klar, weil es Interfaces sind). Wenn ich aber eine Klasse erzegue, die von diese Interface erbt und alle Methoden implementiere, sagt er mir immer noch "es stimmt etwas mit der deklaration nicht" (den genauen Fehler kann ich dir jetzt leider nicht sagen, da ich das Projekt nicht zu Hause habe).

Wenn ich die dll über DllImport verwende, erhalte ich den Fehler, dass "Eine Externe Funktion einen Fehler verursacht".

Da hätte ich gleich noch eine Frage:
Gibt es eine Möglichkeit, aus meinem Programm, während des Debuggens in den Fremden Code zu springen?

Vielen DANK!
 
Hi

Wenn es nur Interface sind, dann benötigst du natürlich noch die Implmentierung.
Ich versteh nur nicht so ganz, was du vor hast.
Was hast du denn vor, wenn du fertig bist? Nur mit dem IDL kannst du nix anfangen. Vorallem, wenn dies nur Interfaces enthält. Hier fehlt die Implementierung.
Falls es dein Ziel ist, die Interfaces zu implementieren, dann poste mal die Fehlermeldungen!

Ja, man kann beim Debuggen in fremden Code springen, aber den brauchst du auch!
Auch hier wäre ggf. etwas mehr Info hilfreich, um da genauere Hilfe zu geben.
 
Hallo,

also ich muss die APIs MCD-3 von ASAM.net zusammen mit einem Diagnose-Server, der auf meinem Rechner installiert ist, verwenden. Anbei findest Du einen Auschnitt der gelieferten .idl (die Daten liegen mir auch als c++-Header (virtual Methoden) und java-Klassen vor, falls sich eines der beiden für mein Vorhaben besser eignet).
Wenn ich mir die selbst erzeugte dll mit dem Programm Reflector ansehe, sehe ich die Klassen und Methoden-Rümpfe (anbei ebenfalls ein Bild).

Neben dem erzeugen der Co-Classe (welche wegen der fehlenden Registrierung nicht geht, hab ich noch folgendes ausprobiert.

Ableiten der Interfaceklasse
Code:
class ASAM_MCD3:IMCDAccessKey
{
    public static extern string get_EcuBaseVariant(); 
 //Fehler: Die ASAM_MCD3.get_EcuBaseVariant()-Methode kann keinen asamMCD3.Interop.IMCDAccessKey.EcuBaseVariant.get-Schnittstellenaccessor 
    //für Typ "ASAM_MCD3" implementieren. Verwenden Sie eine explizite Schnittstellenimplementierung.

  public static extern string get_EcuVariant(){return 0;}
  //Fehler: "ASAM_MCD3.get_EcuVariant()" kann nicht extern sein und Text deklarieren.	
  //Fehler: Die ASAM_MCD3.get_EcuBaseVariant()-Methode kann keinen asamMCD3.Interop.IMCDAccessKey.EcuBaseVariant.get-Schnittstellenaccessor 
  //für Typ "ASAM_MCD3" implementieren. Verwenden Sie eine explizite Schnittstellenimplementierung.
}

Ich hab hier nur mal zwei der Methoden "implementier", ich weiß aber, dass ich alle implentieren muss, aber selbst wenn ich das mache, bleibt es bei den Fehlern (ich muss mich noch ein wenig mit dem "marshalling" auseinander setzen.

Aufruf über DLLImport
Code:
class ASAM_MCD3{

[[DllImport(@"C:\EC-APPS\ESG\E-Sys\lib\environment\ASAM3DNative.dll", EntryPoint = "_Java_asam_d_imp_MCDSystemImp_getASAMMCDVersion@8")]
    public static extern string getASAMMCDVersion();
}

in der main-Class
Code:
ASAM_MCD3.getASAMMCDVersion();
//Fehler: Eine externe Komponente hat eine Ausnahme ausgelöst. 
//  Error-Code -2147467259

Hoffe Du kannst mir weiterhelfen

Danke!
 

Anhänge

  • Reflector_Anzeige.pdf
    35,4 KB · Aufrufe: 76
Dann bin ich ja wenigstens nicht die einzige :)

Aber trotzdem Danke! Werd mir die Links mal ansehen.
 
Zurück