VS C++ tworzenie dll

0

Witam,
Mam kilka pytań dotyczących tworzenia bibliotek:

  1. Czy w Visual Studio C++ mogę stworzyć bibliotekę DLL, którą wykorzystam później w programie napisanym Visual Studio C# jak również innym napisanym w np. Javie?
  2. Z tego co wiem C# jest wolniejszy od C++. Jeżeli program w C# wykorzysta taką bibliotekę ( stworzoną w c++), to jej "zawartość" wykona się w czasie takim jak normalnie w c++ czy c#?
  3. Czy tą samą bibliotekę będę mógł wykorzystać zarówno pod Linuxem jak i Windowsem?
  4. Jaki to jest rodzaj projektu w Visualu? Czy taki? : Nowy projekt > Visual c++ > MCF DLL
  5. Czy Visual c++ to aby na pewno odpowiednie narzędzie do tego celu?

Pozdrawiam i z góry dzięki za pomoc.

0
Bugy napisał(a)

Witam,
Mam kilka pytań dotyczących tworzenia bibliotek:

  1. Czy w Visual Studio C++ mogę stworzyć bibliotekę DLL, którą wykorzystam później w programie napisanym Visual Studio C# jak również innym napisanym w np. Javie?
  2. Z tego co wiem C# jest wolniejszy od C++. Jeżeli program w C# wykorzysta taką bibliotekę ( stworzoną w c++), to jej "zawartość" wykona się w czasie takim jak normalnie w c++ czy c#?
  3. Czy tą samą bibliotekę będę mógł wykorzystać zarówno pod Linuxem jak i Windowsem?
  4. Jaki to jest rodzaj projektu w Visualu? Czy taki? : Nowy projekt > Visual c++ > MCF DLL
  5. Czy Visual c++ to aby na pewno odpowiednie narzędzie do tego celu?

Pozdrawiam i z góry dzięki za pomoc.

  1. Możesz - jeśli stworzysz ją jako bibliotekę z exportowanymi funkacjami 'C-like', będziesz mógł jej używać bezpośrednio w C# przez Reflections. Jeśli to biblioteka w C++ z klasami, to będziesz musiał pośredniczyć przez wrapa/dll w C++/CLI.
  2. 'Zawartość' wykona się w tym samym czasie + narzuty na wywołanie.
  3. nie, no chyba, że wine
  4. jeśli nie masz zamiaru korzystać z MFC, to źle wybierasz.
  5. na Windows - odpowiednie, choć nie jedyne.
0
  1. Java nigdy się nie dogada z C#... No może kilka dziwnych haków, ale to nie dla normalnych ludzi...
  2. Normalnie, głównie dlatego, że .NET wcale strasznie wolniejszy nie jest...
  3. :D
  4. Zależy co chcesz zrobić, w 95% przypadków są lepsze wybory niż C/C++.
0

@Fanael, ale autor chyba chce DLLkę Win32 w C++, a potem używać jej zarówno spod C# jak i Javy, a to już jest wykonalne.

@Bugy - musisz mieć naprawdę dziwne obliczenia albo korzystać ze sprzętu, żeby taka DLLka była znacząco szybsza.

0
somekind napisał(a)

@Fanael, ale autor chyba chce DLLkę Win32 w C++, a potem używać jej (...) spod (...) Javy, a to już jest wykonalne.
JNI to właśnie te haki nie dla normalnych ludzi.

@down: Tja, jest do normalnego używania, tylko to Javowe brzydko wygląda. I jaki manfred?

0

Zawsze myślałem, że FFI to mechanizm do normalnego, codziennego użycia, dla normalnych ludzi... Dzięki manfred za uświadomienie.

0

Ok już wiem, że to czego szukam, to Win32 DLL, próbowałem stworzyć coś takiego, ale niestety bez skutku. W internecie jest 53217864391236 różnych kodów źródłowych, ale niestety połowa się nie kompiluje, a pozostałej części najwyraźniej nie umiem poskładać do kupy.

  1. Da się taką bibliotekę zrobić bez pliku .def ? Bo może to on nie jest linkowany (nie wiem jak to zrobić, póki co to plik po prostu był stworzony z taką zawartością jak zalecali w internecie i nic więcej z nim nie robiłem)

  2. jak ja ją powinienem potem dodać? add existing item czy properties > add refferrence > Browse?

  • w pierwszym przypadku nie mogłem zawołać funkcji z dll
  • w drugim w ogóle nie mogłem dodać - taki error: "Could not add a reference to file ‘plik.dll’ because it is neither a .NET assembly or registered Activex Control."

Proszę, jeżeli ktoś znajdzie wolne 5 min, o podesłanie DLL napisanego w VS c++ niech to będzie najlepiej 1 funkcja wypisująca coś. Do tego malutkiego projekciku najlepiej w VS c# ( po prostu guzik, który wywoła tą funkcję z biblioteki). Proszę tylko o w pełni działające kody.

Pozdrawiam

0

To nie było 5 minut, ale już wiem ;P

  1. New Project -> Windows -> WindowsFormsApplication.
  2. W Solution Explorer dodajemy nowy projekt: Visual C++ -> Win32 -> Win32 Project.
  3. W oknie konfiguracji projektu: Application Type = DLL i zaznaczamy Empty project.
  4. Do Source Files dodajemy New Item -> C++ File, np. Add.cpp.
  5. Wpisujemy kod:
extern "C" int __declspec(dllexport) Add(int a, int b)
{
	return a + b;
}
  1. Teraz zajmujemy się programem w C#, przykładowo:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace CppDllTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int a = DateTime.Now.Hour;
            int b = DateTime.Now.Minute;

            int c = Add(a, b);

            MessageBox.Show(c.ToString());

        }

        [DllImport("Calculator.dll")]
        public static extern int Add(int a, int b);
        
    }
}
  1. W Properties programu C# przechodzimy do Build events -> Edit post build i wklejamy:
    copy "$(SolutionDir)$(ConfigurationName)\Calculator.dll" "$(TargetDir)"
    Dzięki temu plik dll będzie kopiowany w pobliże aplikacji w C# ;)
  2. Solution Platforms domyślnie jest ustawione na "Mixed Platforms". Klikamy w tego ComboBoxa i wybieramy "Configuration Manager", a w nim zmieniamy "Platform" dla naszej aplikacji w C# - z listy w ComboBoxie wybieramy "New", a następnie x86 i OK. Wówczas utworzy nam się nowa "solution platform" o nazwie "x86", możemy już zamknąć Configuration Managera.
  3. F5 i działa ;)
0

Świetnie! Naprawdę jestem Ci bardzo wdzięczny. To jest dokładnie to czego potrzebowałem, wszystko działa jak trzeba.
Jeszcze mam 2 "kosmetyczne" pytania:

  1. Kiedyś używałem biblioteki DLL do SQLite i aby z niej korzystać musiałem wykonać takie czynności: Project > Add reference i nic poza tym. Biblioteki utworzonej według Twojego "przepisu" nie mogę tak dodać, tylko muszę za pomocą linijek kodu. Dlaczego? Da się to tak ustawić? (nie widzę nic złego w tych linijkach, ale tak z ciekawości)
  2. Jak bibliotekę "wbudować? w exe? (czasami to się przydaje)

Pozdrawiam

0

Ad. 1) Bibliotekę napisaną w .NET bez problemu można dodać poprzez "Add reference". Bibliotek niezarządzanych chyba się nie da, a przynajmniej ja nie potrafię.

Ad. 2) Dyskusja o tym i kilka możliwych rozwiązań były tutaj: http://www.codeguru.pl/forum-posts-13022.aspx
Ale tam chyba mowa tylko o kodzie zarządzanym.

0

Odświeżę trochę temat. Spotkał sie ktoś z wyjątkiem
pInvokeStackImbalance.

Właściwie to przepisałem cały kod podany powyżej, zmieniałem atrybuty dllimport i nic nie pomaga.

1

nie mialem przyjemnosci spotkac, ale sadzac po nazwie:

sprawdz jaki calling convention masz "na" funkcji "Add" po stronei jezyka C (cdecl, stddecl,...). jesli nie ustawiales recznie zadnego w kodzie, kompilator zastosowal domyslne - sprawdz jakie jest to domyslne, opcja siedzi w ustawieniach projektu

nastepnie, po stronie C# do DllImport dodaj atrubyt w stylu CallingConvention=CallingConvention.Cdecl i sprawdz czy dalej ten wyjatek bedziesz dostawal.

jesli to nie to, to jeszcze jest sporo mozliwosci innych.. ale wiekszosc sprowadza sie do jakichs Twoich przemilczanych drobnych modyfikacji w kodzie po stronie C, albo ustawien kompilatora

0

Temat wiekowy ale pozwole sobie odkopać.

Zrobiłem dll'kę wg instrukcji @somekind, jednak przy próbie uruchomienia w trybie debugowania aplikacji C# wywala mi błąd:
365e7352cf.png

W trybie release wywala:
5218ec6233.png
ale wynik zwraca dobry.

Podpowiecie co mogłem zrobić nie tak?
Kod biblioteki:

extern "C" int __declspec(dllexport) Add(int a, int b)
{
	return a + b;
}

Kod programu C#:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        [DllImport(@"D:\ENIGMA2\Debug\ENIGMA2.dll")]
        public static extern int Add(int a, int b);
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(Add(3, 5).ToString());
        }
    }
}
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1