none
COM Interop: decimal verwenden RRS feed

  • Frage

  • Hallo allerseits!
     
    Ich habe eine .NET-DLL, deren Funktionalität ich auch in einem VB6-Programm verwenden
    möchte. Dazu habe ich eine Wrapper-DLL mit einem Interface und einer Klasse erstellt:
     
       [ComVisible(true)]
       [Guid("9BA2814B-E5BA-48AB-B8B1-73D34506F5FB")]
       [InterfaceType(ComInterfaceType.InterfaceIsDual)]
       public interface IDirectDebitDocument
       {
          void Initialize
             (
                string id,
                string text,
                string creditorId,
                string creditorName,
                string creditorIban,
                string creditorBic
             );
     
          void AddBooking(string id, string name, string iban, string bic, decimal amount);
     
          void WriteXmlFile(string fileName);
       }
     
       [ComVisible(true)]
       [Guid("8AF99E3B-E4F5-413E-8F35-9C34BC0788E2")]
       [ClassInterface(ClassInterfaceType.None)]
       public class DirectDebitDocument : IDirectDebitDocument
       {
          // Methoden von IDirectDebitDocument
       }
     
    In VB6 kann ich ein Objekt vom Typ DirectDebitDocument problemlos erstellen, auch die
    Methoden Initialize und WriteXmlFile funktionieren einwandfrei.
     
    Sowie ich aber die Methode AddBooking verwenden möchte, bekomme ich folgende Fehlermeldung:
     
          Fehler beim Kompilieren:
     
          Funktion oder Schnittstelle kann nur eingeschränkt verwendet werden
          oder verwendet einen Typ der Automatisierung, der von Visual Basic
          nicht unterstützt wird
     
    Hier der zugehörige VB-Code:
     
       Dim DD As DirectDebitDocument
     
       Set DD = New DirectDebitDocument
     
       DD.Initialize "ABC", "Lorem Ipsum", "XYZ", "MeineFirma", "IBANXXX", "BICXXX"
       DD.AddBooking "ABCDE", "Dr. Max MUSTERMANN", "IBANYYY", "BICYYY", CDec(456.78)
       DD.WriteXmlFile "Z:\Temp\TestDD.VB6.xml"
     
    Das Problem ist der Datentyp decimal beim Parameter amount - ändere ich diesen z.B. auf
    string funktioniert auch der Aufruf von AddBooking.
     
    Mein grundsätzliches Ziel ist es, aus der VB-Applikation heraus einen Currency-Wert an
    die .NET-DLL zu übergeben.
     
    Was mache ich falsch?
     
    TIA
     
    Grüße
    Thomas
     
    --
    Any problem in computer science can be solved with another layer
    of indirection. But that usually will create another problem.
                                       David Wheeler
     
    Mittwoch, 21. November 2012 10:12

Antworten

Alle Antworten

  • Hi Thomas,

    Siehe hier.

    MFG

    Björn

    Mittwoch, 21. November 2012 10:17
  • Hallo Thomas,

    Visual Basic Classic kann mit dem .NET Decimal nichts anfangen.

    Möglich ist es Decimal als Currency zu übertragen:

    void AddBooking(string id, string name, string iban, string bic, 
    	<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.Currency)> _
    	decimal amount);

    Mehr siehe: Visual Basic Fusion: Best Practices to Use Visual Basic 6 and Visual Basic .NET Together

    Gruß Elmar

    Mittwoch, 21. November 2012 10:24
    Beantworter
  • Hallo Björn!
     
    Das hatte ich auch schon probiert gehabt - da der Fehler aber schon beim
    Kompilieren aufgetreten ist, hat's nicht geholfen.
     
    Grüße
    Thomas
     
    --
    Any problem in computer science can be solved with another layer
    of indirection. But that usually will create another problem.
                                       David Wheeler
     
    Donnerstag, 22. November 2012 08:05
  • Hallo Elmar!
     
    > Visual Basic Classic kann mit dem .NET Decimal nichts anfangen.
    >
    > Möglich ist es Decimal als Currency zu übertragen:
    > void AddBooking(string id, string name, string iban, string bic, 
    >         <Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.Currency)> _
    >         decimal amount);
     
    Danke! Das wars.
     
    > Mehr siehe: Visual Basic Fusion: Best Practices to Use Visual Basic 6 and Visual Basic .NET Together
     
    Ich hätte beim googeln doch nicht auf C# einschränken sollen ;-)
     
    Grüße
    Thomas
     
    --
    Any problem in computer science can be solved with another layer
    of indirection. But that usually will create another problem.
                                       David Wheeler
     
    Donnerstag, 22. November 2012 08:06
  • Hallo Thomas,

    auf C# einzuschränken, wenn man Visual Basic Interop sucht, ist nicht unbedingt hilfreich ;)

    Gruß Elmar

    Donnerstag, 22. November 2012 08:46
    Beantworter