c#-dll in c++ Projekt einbinden
-
Ich habe ein C# Projekt, mit Quelldateien, Recourcen, Form1 usw. in ein dll kompiliert, und ich kann sie z.B. von einen anderen C# project aufrufen mit:
PictureAnalysis2.Form1 b; // PictureAnalysis2 ist der namespace in der dll
b = new PictureAnalysis2.Form1();
b.SubMain(); // Aufruf der Funktion "SubMain" von der dllin meiner dll wird dann diese Funktion in der Klasse "Form1" aufgerufen:
public class Form1 : System.Windows.Forms.Form
{
...public void SubMain()
{
MessageBox.Show("PictureAnalysis2.dll is starting");
new Form1().Show ();
}... usw.
Luchan
-
Der einfachste Weg in C++ ist, dass du die Header-Datei der dll einbindest und gegen die *.lib der dll linkst.
Aber das setzt voraus, dass du eine *.h und eine *.lib für deine dll zur Verfügung hast.In einer C++ dll müssen die Funkionen noch exportiert werden:
__declspec (dllexport) void MeineFunktion();
Aber wie das bei C# läuft kann ich dir leider nicht sagen, sorry.
-
danke für deine Antwort
-
Wenn ich mich nicht irre, kannst du zwar mit C++/CLI aus eine unmanaged Dll aufrufen, aber eine managed Dll (C#) aus unmanaged Code (C++) zu laden geht nicht.
Korrigiert mich, wenn ich falsch liege.
-
Stelle Dein "unmanaged" Projekt nach "managed" um (also durch Aktivierung des "/clr"-Compiler switches) und binde dann die C#-DLL einfach durch ein "#using" und ein "Add Reference..." ein.
Das ist zumindest die Einfachste Variante.Eine weitere Möglichkeit ist noch, dass Deine C#-DLL eine COM-Schnittstelle zur Verfügung stellt, die Du dann auch direkt aus unmanaged Code ansprechen kannst (was auf beiden Seiten etwas aufwendig ist).
Oder Du kannst natürlich noch selber die CLR hosten...
http://www.gotdotnet.com/team/clr/about_clr_Hosting.aspx
-
Danke Jochen für deine Antwort,
"Stelle Dein "unmanaged" Projekt nach "managed" um (also durch Aktivierung des "/clr"-Compiler switches)"
- diese Einstellung kann ich so nicht finden in den Properties,
aber das ist bestimmt "Use Managment Extension" welche ich auf
yes gestellt habe, oder ?dann füge ich im header des files wo ich die dll nutzen möchte meine
c# dll ein: using "PictureAnalysis2.dll"wenn ich es dann kompeliere bekomme ich folgende Fehlermeldung:
"... Command line error D2016 : '/RTC1' and '/clr' command-line options
are incompatible"- meine Properties sind u.a.:
C/C++ -> Code Generation -> Basic Runtime Checks: Default (auch mit den
anderen gehts nicht)
-> Runtime Library: Multi-threaded Debug DLL(/MDd)Als Info, ich nutze .net 2003 mit dem .Net Framework 1.1,
dann habe ich ein "fertiges" MFC - Projekt und eine c# dll, welche ich beide
mit dem .net 2003 kompiliere habe.Danke und Gruss,
Luchan
-
Ja, Du musst die passenden Änderungen machen, damit die Projekteinstellungen passen. Dann sollte es aber gehen.
-
Hallo Jochen,
also mit .net 2003 habe ich die Fehlermeldung:
"... Command line error D2016 : '/RTC1' and '/clr' command-line options
are incompatible "nicht wegbekommen, auch mit verschiedensten Änderungen in der Properties:
Basic Runtime Checks: Default, ...
Runtime Library: Multi-threaded Debug DLL(/MDd), ... usw.,nun habe ich das mit "Visual Studio 2005" probiert, da kommt wenn ich die dll
using "PictureAnalysis2.dll"
einbinde kommt dann sogar die Fehlermeldung:
"... error C2059: syntax error : 'string' ..."
Sonst lese ich aber auch in den Foren das man das mit einen Wrapper, bzw. als
Com verpacken muss, das mit using wäre wohl leider zu einfachLuchan
-
Du musst von /RTC1 auf "Default" stellen; dann dürft die Meldung nicht mehr kommen.
Und wie am Anfang gesagt! Es gibt verschiedene Arten auf C#-DLLs zuzugreifen! Siehe mein erstes Posting...
-
Hi Jochen,
habe alles schon probiert, geht trotzdem nicht,
der Run Time Check war auch schon auf Default gestellt,
ich denke da ist noch etwas anderes mit den MFC-Projekt
weshalb es so nicht geht (?),
dieses MFC-Projekt wird zum initialisieren von Firewire-Kameras
genommen und kann runtergeladen werden von der homepage der
deutschen Firma: http://www.alliedvisiontec.de/es gebe noch die möglichkeit ,falls du sowas überhaupt machst,
das du es dir ma runterlädst (ca. 7MB)und startest, (würde nur 2min dauern, ich würde dir dann noch den genauen Pfad schicken) und versuchst es mit einer c# dll zu verbinden
(ich kann dir noch meine c# dll (40kb) schicke falls das erforderlich wäre)
- ich bräuchte dann natürlich noch deine E-Mail adresse,weil so klappt das bei mir jedenfalls nicht obwohl das so schön einfach
klingt, zu schön um wahr zu sein :-),falls nicht muss ich es dann doch mit einer Com-Schnittstelle
probieren oder einen WrapperLuchan
-
Ich hab eine E-Mail Adresse hinterlegt... schick mir mal eine Mail...