COM dll erstellen aus C#-Klasse
-
Hallo,
ich habe folgende Problemstellung: Wir brauchen einen einfach Zugang für LabView,Excel und Orgin auf unsere Microsoft SQL Server Datenbank.
Wir haben uns nun für eine COM dll entschieden, da besagte Programme (soweit bekannt) COM unterstützen.
Weil .NET einen so komfortablen Zugang auf SQLDBs ermöglicht habe ich nun eine Klasse in C# geschrieben, die alles leistet, was wir brauchen.
Problem dabei ist nur, dass ich keine COM dll erzeugt kriege, beziehungsweise diese keine exporte enthält (also ich kann sie in Excel einbinden, aber der Objectkatalog zeigt keine exports an).
Das deckt sich auch ganz gut mit der Fehlermeldung des postbuilds aus VS2008:------ Rebuild All started: Project: COMDBInterface, Configuration: Release Any CPU ------
warning MSB3391: "COMDBInterface.dll" does not contain any types that can be unregistered for COM Interop.
...
Compile complete -- 0 errors, 0 warnings
...
warning MSB3214: "COMDBInterface.dll" does not contain any types that can be registered for COM Interop.
...
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========Hier der Code: (die konkrete Implementation der Methoden hab ich weggelassen; die funktioniert auch soweit)
namespace COMDBInterface { [Guid("DBE0E8C4-1C61-41f3-B6A4-4E2F353D3D05")] [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] [ComVisible(true)] public interface IHHIDB { string ForceString(); int Connect(); int Close(); int Execute(String szCmd); int GetInt(); double GetDouble(); string GetString(); } [Guid("C6659361-1625-4746-931C-36014B146679")] [ClassInterface(ClassInterfaceType.None)] [ProgId("COMDBInterface.HHIDB")] [ComVisible(true)] class HHIDB : IHHIDB { public HHIDB(String szUser, String szPWD) { ... } public int Execute(String szCmd) { ... } public int Connect() { ... } private int AddSequence(string szSeq) { ... } public string GetSequence() { ... } public string ForceString() { ... } public int GetInt() { ... } public double GetDouble() { ... } public string GetString() { ... } } }
Unter Project->Properties, habe ich gesetzt:
Register for COM interop->checked
Assembly Information->Make Assembly COM visible->checkedProjecttype ist: C#::Class Library (der Code ist allerdings getestet in einer Consolen application und dann copy&paste)
Außerdem mußte ich mit regasm COMDBInterface.dll /tlb:COMDBInterface.tlb manuell "registeren", da er es alleine nicht gemacht hat.
Im AssemblyInfo.cs ist [assembly: ComVisible(true)] gesetzt.
Außerdem muss ich sagen, dass dies meine erstes C# Machwerk ist und ich bisher noch nie eine COM dll geschrieben habe.
Die GUIDs hab ich aus einem MSDN beitrag zu COM interop adoptiert (kann es daran liegen? - wie kann ich die selbst erstellen?). Eigentlich ist alles COM betreffende geklaut
, ich weiß auch nicht so richtig, was die Zeilen genau bedeuten, vielleicht hat ja wer ein gutes tutorial zur Hand... google hilft mir leider nicht recht weiter...
Ich wäre für Hilfe sehr dankbar, da dies hier doch relativ eilig ist und ironischer Weise der Code selbst ja funktioniert
Edit/Nachtrag: Liegt das vielleicht irgendwie daran, dass ich kein dtor habe oder der ctor Parameter schluckt?
gruß