C#-Klassenbibliothek auch in C++-Programmen (MFC/VC++ 6.0) verwenden?



  • Hi Leute,
    Ist es möglich, eine Klassenbibliothek, die in C# geschrieben wurde, auch in C++-Programmen, die die MFC verwenden, zu benutzen?



  • Hallo,
    es ist schon möglich, aber ein wenig... wie auch immer.
    Es gibt im Namespace Microsoft::VisualBasic eine Attributklasse, die ComClass heisst. Damit könnte man für die Klassen in der Lib einen "Com"-Kopf generieren. Vielleicht geht das 😕 , aber ich hab das nie ausprobiert.



  • Übrigens muss man dann in den Klassen einige Konstanten definieren :

    public const System.String ClassId = "3DE863C7-88CE-42C7-8EC3-165F81151FE4";
    public const System.String InterfaceId = "8044101C-DCEA-4748-B1FB-C7F1AB87CFB5";
    public const System.String EventId = "DF62162B-DBA5-4A76-BF3C-61233FA8834A";
    

    mfg blueshift



  • hm, also arg umständlich?
    Es geht nämlich um folgendes:
    Es gibt ein SDK von MS (Das TabletPC-SDK), dass man unter .NET (C#, VB.NET) ganz normal verwenden kann, man kann also ganz normal auf die Klassen zugreifen. In C++ geht das nicht, dort muss man es über das COM-Interface machen und ich habe den Verdacht, dass bei der COM-Implementation ein Fehler drin ist. Deswegen wollte ich ne DLL machen, mit der ich auf die normalen Klassen zugreifen kann.



  • Guten Morgen (bzw. Mittag),
    mit C++.Net wäre das Problem bestimmt einfacher zu lösen.
    Dort kann man alles in eine MFC-Klasse reinstopfen (also .Net Klassen, C-Funktionen, Inline-Asm, etc.). Fals es dir weiter hilft, hab ich hier mal den VB.net Code einer "Com-Klasse" (die wurde autom. generiert, ich schreib kein VB.net mehr 😃 ) :

    Imports Microsoft.VisualBasic
    <ComClass(MyComClass.ClassId, MyComClass.InterfaceId, MyComClass.EventsId)> _
    Public NotInheritable Class MyComClass
        Inherits System.Object
    
    #Region "COM GUIDs"
        ' Diese GUIDs stellen die COM-Identität für diese Klasse 
        ' und ihre COM-Schnittstellen bereit. Wenn Sie sie ändern, können 
        ' vorhandene Clients nicht mehr auf die Klasse zugreifen.
        Public Const ClassId As String = "04316412-C97A-4A3A-80CA-FD6CCD83D767"
        Public Const InterfaceId As String = "AF5A75A2-CE6D-4033-A419-0B380A9AAD76"
        Public Const EventsId As String = "5A3F0216-BFA6-4486-8A01-56142865A22F"
    #End Region
    
        ' Eine erstellbare COM-Klasse muss eine Public Sub New() 
        ' ohne Parameter haben. Andernfalls wird die Klasse möglicherweise nicht 
        ' in der COM-Registrierung registriert und kann nicht über 
        ' ein CreateObject erstellt werden.
        Public Sub New()
            MyBase.New()
        End Sub
    
    End Class
    

    Wie schon gesagt, hab ich das nie probiert, da ich nie direkt mit Com gearbeitet habe.



  • Aha 😕
    Kann kein VB 🙄
    Werd später mal versuchen, das zu kapieren. Trotzdem thx.



  • Ich kann ja versuchen das umzuschreiben (kann C# nicht wirklich, nur C++.Net).
    Also :

    [Microsoft.VisualBasic.ComClassAttribute(MyComClass.ClassId, MyComClass.InterfaceId, MyComClass.EventId)] public sealed class MyComClass : System.Object 
    {
    	// .ctor
    	public MyComClass()
    	{
    	}
    	// ...
    	public const System.String ClassId = "04316412-C97A-4A3A-80CA-FD6CCD83D767";
    	public const System.String InterfaceId = "AF5A75A2-CE6D-4033-A419-0B380A9AAD76";
    	public const System.String EventId = "5A3F0216-BFA6-4486-8A01-56142865A22F";
    }
    

    Ich denk so solte es gehen... 🙂


Anmelden zum Antworten