none
COM-Schnittstelle in C# designen (hier: ByVal) RRS feed

  • Allgemeine Diskussion

  • Ich hab grad einige Probleme die richtigen Quellen zu finden, die mich beim Erstellen einer COM-Schnittstelle unter C# unterstützen.

    Viele Sachen habe ich bereits herausgefunden, selbst hergeleitet, aus Beispielen destilliert, aber eine Sache bekomme ich derzeit einfach nicht hin. Und auch wenn es auf den ersten Blick überflüssig erscheinen mag, so interessiert mich doch der Mechanismus dahinter und welchen Unterschied es ausmacht.

    Und zwar geht es um das aus VB bekannte Schlüsselwort "ByVal".

    In der Online-Hilfe heißt es dazu:

    [Visual Basic]
    
    Function ConvertUSDollarsToCDN(ByVal usd As Double) As Double
    
    [C#]
    
    double ConvertUSDollarsToCDN(double usd);
    
    

    Ich will also, dass ein Funktionsparameter als "ByVal" übergeben wird. Das Problem ist nun: Wenn ich mir das Resultat beider Varianten in der erzeugten COM-DLL per Object-Browser (z.B. dem in VB) anschaue, dann erscheint sie bei der in VB erzeugten Schnittstelle so wie sie oben steht. Bei der mit C# erzeugten Schnittstelle steht dort jedoch:

    Function ConvertUSDollarsToCDN(usd As Double) As Double


    Man sieht: Das Schlüsselwort "ByVal" fehlt.

    Wie gesagt, für die Funktionsfähigkeit meiner Anwendung ist das nicht überlebenswichtig. Angeblich geht mein C#-Programm sowieso von "byval" aus, solange das Schlüsselwort bzw. Attribut "byref" nicht angegeben ist. Zur Sicherheit kann ich auch in meinem C#-Code darauf achten, dass der übergebene Wert nicht geändert sondern ggf. mit Kopien davon gearbeitet wird.

    Nichtsdestotrotz gebietet mein COM-Verständnis, dass man auch in C# die Möglichkeit haben müsste, eine Funktion so zu deklarieren, dass sie in der entstehenden TypeLib auch entsprechend mit "ByVal" angezeigt wird.

    Immerhin habe ich es auch geschafft (obwohl erste Recherchen suggerierten, das würde nicht gehen), in C# die Schnittstelle mit Funktionen auszustatten, die optionale Parameter mit Defaultwerten enthalten:

    void Init([In] string ExePfad, [In] string DatenPfad, [In, Optional(), DefaultParameterValue(false)] bool NewInstance);
    
    

    Hat jemand ne Idee bzgl. "ByVal"?

    • Typ geändert Ralf Brostedt Freitag, 11. November 2011 10:02 Keine Lösung auf die Frage zu erwarten
    Donnerstag, 10. November 2011 11:14

Alle Antworten

  • Hi,

    Variablen werden in C# IMMER By Value übergeben. Nur wenn du explizit ref / out angibst wird die Referenz übergeben.. Du musst also bei c# Schnittstellen nicht byVal angeben, da dieses Microsoftgott gegeben ist ;-)

    Donnerstag, 10. November 2011 11:43
  • Angeblich geht mein C#-Programm sowieso von "byval" aus, solange das Schlüsselwort bzw. Attribut "byref" nicht angegeben ist.
    Denk dir das "Angeblich" am Satzanfang weg und du siehst, dass mir das bereits bekannt war. Ich will aber keine C#-Schnittstelle, sondern eine COM-Schnittstelle, und in der von VS2008 erzeugten zugehörigen TypeLib ist der Parameter _nicht_ als ByVal markiert. Mag vielleicht nur Kosmetik sein, trotzdem wurmt es mich.
    Donnerstag, 10. November 2011 12:07
  • Was soll ich dazu noch sagen ? Ausser leb damit ? :-)

    Grüße

    Donnerstag, 10. November 2011 12:53