Typ String(*) nach Update auf Visual Studio 2015

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Typ String(*) nach Update auf Visual Studio 2015

    Hallo zusammen,

    und zwar habe ich ein sehr komisches Verhalten. Folgendes Problem:
    Ich habe gestern auf Visual Studio 2015 Professional von Visual Studio 2013 Professional umgestellt.
    Soweit alles okay. Beim Öffnen des Solution-Projekts habe ich erstmal 500 Fehler bekommen, weil verweise gefehlt haben. Das ist ja nicht weiter schlimm, die habe ich einfach neu gesetzt.
    So nun zum eigentlich Problem: Wir verwenden eine externe DLL, die eine statische Methode hat, die wir aufrufen. Diese Methode benötigt mehrere Parameter und darunter auch einer vom Typ String(*).
    In diesen Parameter geben wir zurzeit einfach ein String-Array rein (Typ: String()). In Visual Studio 2013 hat das funktioniert. Ab Visual Studio 2015 nicht mehr. Er meckert, dass er vom Typ String() nicht in String(*) konvertieren kann. Das Zielframework ist dasselbe geblieben (.NET Framework 4.5). Ein Update des Frameworks kommt nicht in Frage.

    Informationen zu der DLL:
    Wir stellen diese DLL selbst bereit. Die DLL wird im Programm "LabView" erstellt und im .NET eingebunden. Dort gibt es nur die Möglichkeit die CLR Version zu ändern. Da wir aber weiterhin .NET Framework 4.5 verwenden sehen wir keinen Grund dies zu ändern.

    Hat irgendjemand eine Idee ohne dass wir die DLL aufbohren müssen? Bin kein LabView-Experte, aber ich glaube sogar dass dieser String(*)-Typ in LabView ein normales String-Array ist und nicht in einen anderen Typ geändert werden kann.

    Gruß Yannici

    Yannici schrieb:

    in einen anderen Typ geändert werden kann
    Probier mal ein einfaches C#-Projekt, in dem Du per unsafe einen String*-Pointer übergibst.
    Woher kommt die String*-Deklaration? Kann man die in String() ändern?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Probier mal ein einfaches C#-Projekt, in dem Du per unsafe einen String*-Pointer übergibst.

    Wie kann ich denn in C# einen String-Pointer deklarieren?

    RodFromGermany schrieb:

    Woher kommt die String*-Deklaration? Kann man die in String() ändern?

    Wie gesagt kommt die String(*) Deklaration aus dem Programm LabView, aus der die DLL erstellt wird. Leider ist unser LabView-Entwickler zurzeit nicht erreichbar. Ich sehe aber keinen Grund das zu ändern, wo es in Visual Studio 2013 mit derselben DLL doch auch funktioniert hat.

    exc-jdbi schrieb:

    Zeig uns doch wie die Einstiegs-Funktion ist, und am Besten noch wie du vorher darauf gegriffen hast.


    VB.NET-Quellcode

    1. Public Function GetUnits(DataClusterIndex As Integer) As String()
    2. Dim valueOut As Double = 0
    3. Dim digitsOut As Byte = 0
    4. Dim unitOut As String = String.Empty
    5. Dim unitCollOut As String() = {}
    6. Dim unitTypeOut As Laboratory.Calibration.Unit__32Type = Gui.Laboratory.Calibration.Unit__32Type.None__32Units
    7. Dim variableListItemNameOut As String = String.Empty
    8. Dim variableListItemSortIndexOut As Integer = -1
    9. Dim variableListIndexOut As Integer = -1
    10. Laboratory.Calibration.FlowMeasurement.GetItemData( _
    11. 0, Me.ToString(), DataClusterIndex, _
    12. valueOut, digitsOut, unitOut, unitCollOut, unitTypeOut, variableListItemNameOut, variableListItemSortIndexOut, variableListIndexOut)
    13. Return unitCollOut
    14. End Function


    Was evtl. noch wichtig ist: Ab dem 4. Parameter sind die Parameter als Referenz (ByRef) definiert. Deshalb wird die Variable unitCollOut in die Methode gegeben und wird gefüllt. Achja: Den Fehler bekomme ich beim Parameter wo unitCollOut als Referenz übergeben wird.

    Yannici schrieb:

    Wie kann ich denn in C# einen String-Pointer deklarieren?
    Sorry, für String scheint das ganze wohl nicht zu funktionieren.
    Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Guten Morgen Yannici

    Ich kenne mich leider nicht mit dem LabVIEW aus. Aber so wie ich das erkennen kann, handelt es sich doch um eine WIN32-DLL und nicht um eine .Net-DLL. Vielleicht täusche ich mich auch, und es ist möglich mit LabVIEW .NET-Libarys zu erstellen.

    Wenn es sich um eine WIN32-DLL handelt, dann hast du mit String keine chance. siehe hier unter dem Titel 'String-Daten'.
    ni.com/white-paper/4877/de/

    Auf github unter base64- Repositories habe ich ein Beispiel wie ich WIN32-DLL's einbinde. Vielleicht hilft es dir ja.


    Freundliche Grüsse

    exc-jdbi
    Morgen exc-jdbi,

    nein, die in LabVIEW erstellte DLL ist eine normale Assembly, die man normal als Verweis im Visual Studio hinzufügen kann. Unter Angabe der CLR-Version ist diese für .NET verfügbar.
    Wenn man die Metadaten der Assembly im Visual Studio anschaut ist die Methoden-Deklaration sogar korrekt:

    VB.NET-Quellcode

    1. Public Shared Sub GetItemData(valueIn As Double, calibrationMethodXmlStringIn As String, variableListIndexIn As Integer, ByRef valueOut As Double, ByRef digitsOut As Byte, ByRef unitOut As String, ByRef unitCollectionOut() As String, ByRef unitTypeOut As Unit__32Type, ByRef variableListItemNameOut As String, ByRef variableListItemSortIndexOut As Integer, ByRef variableListIndexOut As Integer)


    Ich steh echt auf dem Schlauch. Warum sollte sich das Verhalten in Visual Studio 2015 im Gegensatz zu Visual Studio 2013 verändern?
    Hallo Yannici

    Also ich wüsste da schon etwas, aber ich finde das so schräg, wenn du diesen Weg gehen müsstest. Ich vermute da ist doch irgendwas nicht korrekt eingestellt, oder irgendetwas muss noch gemacht werden, damit das funktioniert in VS 2015.

    Ansonsten eben hier. Ich habe hier mal eine Möglichkeit erwähnt, die ich nutze zum String-Arrays zu übergeben.
    vb.net array to c-Dll

    Ich werde noch später ein Beispiel anhängen, weil dieses Prinzip funkst auch für .Net-Assembly.

    Aber eben ich hoffe schon das es einen anderen Weg gibt.

    Freundliche Grüsse

    exc-jdbi
    Dateien
    • Test.zip

      (5,51 kB, 197 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()