Dll in Console vs Dll in WPF

  • C#
  • .NET (FX) 4.0

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Dll in Console vs Dll in WPF

    Ich hab einmal ein Konsolenprojekt und einmal ein WPF projekt...der Code ist der selbe...einmal klappt der import der Dll einmal nicht...warum?

    funktioniert mit WPF

    Spoiler anzeigen

    C#-Quellcode

    1. ​using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Runtime.InteropServices;
    5. using System.Text;
    6. using System.Windows;
    7. using System.Windows.Controls;
    8. using System.Windows.Data;
    9. using System.Windows.Documents;
    10. using System.Windows.Input;
    11. using System.Windows.Media;
    12. using System.Windows.Media.Imaging;
    13. using System.Windows.Navigation;
    14. using System.Windows.Shapes;
    15. namespace TestOhneWCFdll
    16. {
    17. public partial class MainWindow : Window
    18. {
    19. public MainWindow()
    20. {
    21. InitializeComponent();
    22. }
    23. public void OnClick(object sender, EventArgs e)
    24. {
    25. txtBox.Text = DLLCaller.Call();
    26. }
    27. }
    28. public static class DLLCaller
    29. {
    30. [DllImport("CallSkalaFkt.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
    31. private static extern Int32 CallSkalaFkt_SkalaStart(Int32 _hWnd, string _DB_Path, string _GLOB_GUID, string _RG_PATH, Int32 _EE_ID, Int32 _EE_Par, Int32 new_Ring, Int32 _auto_Start, ref Int32 Status_Flag);
    32. public static string Call()
    33. {
    34. System.Threading.Thread.Sleep(1000);
    35. string _DB_Path = "D:\\Projekte\\Skala_Simu\\Simu\\Glob_Simu.mdb";
    36. string _GLOB_GUID = "{guid{5ACB1481-2692-4C66-8BBC-9CC8B9FDF0C2}}";
    37. string _RG_PATH = "D:\\Projekte\\Skala_Simu\\Simu\\";
    38. Int32 _hWnd = 0;
    39. Int32 _EE_ID = 1;
    40. Int32 _EE_Par = 0;
    41. Int32 new_Ring = 1;
    42. Int32 _auto_Start = 0;
    43. Int32 Status_Flag = 0;
    44. GCHandle m_gch = GCHandle.Alloc(Status_Flag, GCHandleType.Pinned);
    45. try
    46. {
    47. int tmp = CallSkalaFkt_SkalaStart(_hWnd, _DB_Path, _GLOB_GUID, _RG_PATH, _EE_ID, _EE_Par, new_Ring, _auto_Start, ref Status_Flag);
    48. m_gch.Free();
    49. return tmp.ToString();
    50. }
    51. catch (Exception ex)
    52. {
    53. return ex.Message;
    54. }
    55. }
    56. }
    57. }


    XML-Quellcode

    1. ​<Window x:Class="TestOhneWCFdll.MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. Title="MainWindow" Height="350" Width="525" Background="DarkGray">
    5. <Grid>
    6. <Button Content="Klick mich"
    7. HorizontalAlignment="Left"
    8. Height="120"
    9. Margin="128,39,0,0"
    10. VerticalAlignment="Top"
    11. Width="249"
    12. Click="OnClick"
    13. />
    14. <TextBox HorizontalAlignment="Left"
    15. Height="92"
    16. Margin="95,200,0,0"
    17. TextWrapping="Wrap"
    18. Text=""
    19. FontWeight="Bold"
    20. VerticalAlignment="Top" Width="325"
    21. Name="txtBox"/>
    22. </Grid>
    23. </Window>


    mit der Konsole kommt die Meldung, dass es im falschen Format wäre...

    Spoiler anzeigen

    C#-Quellcode

    1. ​using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Runtime.InteropServices;
    5. using System.Text;
    6. namespace ConsoleDll
    7. {
    8. class Program
    9. {
    10. static void Main(string[] args)
    11. {
    12. Console.WriteLine(DLLCaller.Call());
    13. Console.Read();
    14. }
    15. }
    16. public static class DLLCaller
    17. {
    18. [DllImport("CallSkalaFkt.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
    19. private static extern Int32 CallSkalaFkt_SkalaStart(Int32 _hWnd, string _DB_Path, string _GLOB_GUID, string _RG_PATH, Int32 _EE_ID, Int32 _EE_Par, Int32 new_Ring, Int32 _auto_Start, ref Int32 Status_Flag);
    20. public static string Call()
    21. {
    22. System.Threading.Thread.Sleep(1000);
    23. string _DB_Path = "D:\\Projekte\\Skala_Simu\\Simu\\Glob_Simu.mdb";
    24. string _GLOB_GUID = "{guid{5ACB1481-2692-4C66-8BBC-9CC8B9FDF0C2}}";
    25. string _RG_PATH = "D:\\Projekte\\Skala_Simu\\Simu\\";
    26. Int32 _hWnd = 0;
    27. Int32 _EE_ID = 1;
    28. Int32 _EE_Par = 0;
    29. Int32 new_Ring = 1;
    30. Int32 _auto_Start = 0;
    31. Int32 Status_Flag = 0;
    32. GCHandle m_gch = GCHandle.Alloc(Status_Flag, GCHandleType.Pinned);
    33. try
    34. {
    35. int tmp = CallSkalaFkt_SkalaStart(_hWnd, _DB_Path, _GLOB_GUID, _RG_PATH, _EE_ID, _EE_Par, new_Ring, _auto_Start, ref Status_Flag);
    36. m_gch.Free();
    37. return tmp.ToString();
    38. }
    39. catch (Exception ex)
    40. {
    41. return ex.Message;
    42. }
    43. }
    44. }
    45. }


    muss man beim importieren von ner Dll bei nem Konsolenprog. was beachten??
    die Verweise sind in beiden Projekten die selben, die using Direktiven, die nicht dabei sind, sind eigentlich nur für die Fenster...auch wenn ich die einfüge ändert sich nichts...mich irritiert das ein wenig, da man bei Google viele Projekte findet, bei denen mit Konsolenprojekten Dlls importiert werden...
    habe ein neu angelegtes WPF-Projekt mit der DLL jetzt zum Laufen gebraucht, das hatte anfangs den selben Fehler wie das Konsolen-Projekt...Der Grund war, dass mein Visual Studio manchmal gesetzte Einstellungen nicht speichert bzw ignoriert...

    So läuft mein WPF-Projekt jetzt, wenn ich unter Projekteinstellungen bei Zielplattform x86 einstelle (das hatte ich aber schon versucht, aber mein VS hat es immer wieder auf anyCpu zurück gesetzt) bei meinem Konsolenprojekt ist zwar x86 eingestellt und es bleibt auch so wenn ich das Projekt schließe und wieder öffne aber der Fehler bleibt ebenfalls bestehen...

    jetzt noch eine Frage zu den Einstellungen...

    im angehängten Bild sieht man das Einstellungsfenster unter dem Reiter "Erstellen"

    dort kann ich ganz oben in der ersten Zeile die Konfiguration und die Plattform wählen...

    etwas weiter unten in der 5. Zeile kann ich nochmal die Zielplattform auswählen...was ist der Unterschied zwischen den beiden gewählten Plattformeinstellungen?
    Bilder
    • Einstellungen.png

      13,6 kB, 732×319, 181 mal angesehen
    Das oben ist nur für mehrere Konfigurationen, das unten ist die Einstellung für die aktuell gewählte Konfiguration. Wobei x86 für den Aufruf einer 32-Bit nativen Dll komplett korrekt ist.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    mein Ursprungsprojekt läuft jetzt dank eurer Hilfe :thumbsup:

    das einzige was jetzt (nach derzeitigem Stand) noch fraglich ist, ist ob es gut/sinnvoll/möglich ist den Server (der jetzt zwangsläufig als WPF läuft) als Dienst laufen zu lassen (wenn er mit WPF realisiert ist)
    WPF+Dienst? Das würde ja komplett den Sinn eines Dienstes kaputt machen. Du könntest vlt. einen Dienst machen und eine WPF Anwendung, die dann mit dem Dienst kommmuniziert.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    ja das dachte ich auch, dass das nicht groß Sinn ergibt mit dem WPF als Dienst...deswegen war ja mein Plan das ganze als Console zu machen...aber das funktioniert wie erwähnt aus unerfindlichen Gründen nicht...und da sich das WPF auch als Dienst einrichten lässt und es lauffähig ist, muss ich jetzt damit vorlieb nehmen, bis ich vllt mal ne Alternative gefunden habe

    [edit] Tipps/Vorschläge sind trotzdem willkommen
    hast du vlt. header-Dateien der Library, dann könntest die z.B. mal posten, oder sonstige Informationen über die DLL, vlt. wurde sie ja sogar in 64 Bit kompiliert...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    code zur Dll ist leider vertraulich...und die dll ist mit 32bit kompiliert und mein Projekt läuft mit x86 als zielplattform

    [edit] entweder hat das VS den Fehler jetzt beseitigt oder er taucht einfach nicht mehr auf... habs jetzt 20 mal gestartet, ausgeführt und gestoppt und der Fehler ist bisher nicht mehr aufgetaucht... vllt sollte ich VS mal neu installieren...seit ner Woche zickt es rum und macht komische Sachen...
    deshalb hatte ich nur nach dem Header gefragt, dort stehen ja auch nur die Prototypen drinnen, sonst hättest du uns ja auch nicht den DLL aufruf zeigen dürfen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Was auch immer der Programmierer dort reinschreibt, aber idr braucht man den Header um die DLl in anderen C programmen zu nutzen, damit der Compiler weiß, was für Funktionen es gibt.
    Also der Header enthält normalerweise Prototypen, also nur Signatur der Funktionen. Ist außerdem die Datei mit der Endung .h(pp). Kannst ja mal rein gucken
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---