Results 1 to 7 of 7
Thread: Ïðîáëåì ñ âðúçêà C++ <-> C++/CLI
Hybrid View
-
13th September 2009 22:18 #1
Ïðîáëåì ñ âðúçêà C++ <-> C++/CLI
 ìîìåíòà íàâëèçàì â C#, êàòî èìàì áàçîâ îïèò ñúñ C++.
Íàëàãà ìè ñå äà ïîëçâàì åäèí DLL, êîéòî ñúì ïèñàë íà C++( unmanaged ), â C# ïðèëîæåíèå.
È òóê ñå ïîÿâÿâà C++ .NET, ñ êîåòî íÿìàì àáñîëþòíî íèêàêúâ îïèò. Íÿêîëêî äíè ÷åòà òóòîðèàëè, íî ÷åñòíî êàçàíî ìå îáúðêàõà ïîâå÷å, çàùîòî íàâñÿêúäå äàâàò ïðèìåðè ñ ðàçëè÷åí ñèíòàêñèñ. Óñïÿõ äà ïîäêàðàì DLL-à äà ñå êîìïèëèðà ñ /clr è ìîãà äà ãî ïîëçâàì â C# ïðèëîæåíèåòî áåç ïðîáëåì. Íî íå ìîãà äà ðàçáåðà êîé å íàé-äîáðèÿò íà÷èí äà ïðåäàâàì ïðîìåíëèâè ìåæäó DLL è C# ïðèëîæåíèåòî.
Íàìåðèõ îáùî êúì 4 íà÷èíà, êàòî íèòî åäèí äîðè íå óñïÿõ äà ïîäêàðàì.
 DLL ïîëçâàì unmanaged ïðîìåíëèâè.  C# ïîäàâàì íà dll-ôóíêöèÿ managed ïðîìåíëèâà, íî íå ìîãà äà ðàçáåðà êàê äà ÿ ïîëçâàì.
 ìîìåíòà ñå ìú÷à ñ ìàðøàëèíã:
è ñúîòâåòíî â C# ãî ïîëçâàì òàêà:Code:void MyClass::func( System::String^ str ) { char* str2 = (char*)Marshal::StringToHGlobalAnsi(str).ToPointer(); printf( str2 ); // works // free the memory for str2... // .... }
Òîçè êîä ðàáîòè, íî íå ìè âúðøè íàïúëíî ðàáîòà - áèõ èñêàë äà ìîãà äà ïðîìåíÿ str1 , êàêòî è äà âðúùàì ðåçóëòàò îò ôóíêöèèòå â DLL-à.Code:class Start { public static void Main() { MyClass var = new MyClass(); string str1 = "managed call"; var.func(str1 ); } }
Àêî íÿêîé ìîæå äà ìè îáÿñíè ñ äâå-òðè äóìè êàê íàé-äîáðå äà ïðåäàâàì ïðîìåíëèâè â äâåòå ïîñîêè, çàùîòî ñúì â çàäúíåíà óëèöà ñ òîçè C++/CLI
.
Äà ñå ïðåíàïèøå DLL èçöÿëî êàòî managed íå å âàðèàíò, çàùîòî òîé èãðàå ðîëÿòà íà wrapper íà API çà ðàáîòà ñ USB óñòðîéñòâî, êîåòî ïúê îò ñâîÿ ñòðàíà å ïèñàíî íà C.
Èìàì è âòîðè âúïðîñ. MyClass â DLL-à å managed. Òîâà îçíà÷àâà ëè, ÷å garbage collectora ñå ãðèæè è çà unmanaged ïðîìåíëèâèòå íà êëàñà?
Èëè òðÿáâà äà èìïëåìåíòèðàì IDisposable è ÷àê òîãàâà ùå ãî ïðàâè?
Òîâà íå ìè ñòàíà ÿñíî, çàùîòî â íÿêîëêî ôîðóìà âèäÿõ è äâåòå ìíåíèÿ
---------- Äîáàâåí ïîñëåäâàù êîìåíòàð â 21:18 ---------- Îðèãèíàëíèÿò êîìåíòàð å ïóñíàò â 17:41 ----------
-- Îïðàâèõ ñå ñàì --
Last edited by genn; 13th September 2009 at 20:33.
-
14th September 2009 00:11 #2
Ååå, åãàòè. Íå äàäå øàíñ äîðè äà ñå îïèòàìå äà òè ïîìîãíåì. Ìíîãî ñè ëîø

Êàòî ñè ãî îòêðèë, ùå ãî ñïîäåëèø ëè ñ íàñ, íà ìåí ìè ñòàíà èíòåðåñíî ïîíå
Åòî òàêà ñå ïëîäÿò òå, êàçâàì ñè àç. Ïîä íîñà òè.
"640K îught to be enough for anybody" - Bill Gates, 1981
Òåñòîâå íà áàòåðèè::Machine specs::Fract::AGG::ÍåÑåÑúðäè×îâå÷å::Baileys::blog::YouTube channel
-
14th September 2009 01:15 #3
Ìîæåø äà èçïîëçâàø C API-òî äèðåêòíî ïî òîçè íà÷èí:
DLL
C#Code:extern "C" { //Note: must use __declspec(dllexport) to make (export) methods as 'public' __declspec(dllexport) void DoSomethingInC(unsigned short int ExampleParam, unsigned char AnotherExampleParam) { printf("You called method DoSomethingInC(), You passed in %d and %c\n\r", ExampleParam, AnotherExampleParam); } }//End 'extern "C"' to prevent name mangling
Code:class Program { [DllImport("Win32.dll", EntryPoint = "DoSomethingInC")] public static extern void DoSomethingInC(ushort ExampleParam, char AnotherExampleParam); static void Main(string[] args) { Program.DoSomethingInC(15, 'W'); } }
-
14th September 2009 02:51 #4
@ñèìî: Äà, òîâà å äðóãèÿò âàðèàíò çà âêàðâàíå íà DLL, íî äîñòà ïî-åëåãàíòíî å äà ãî äîáàâèø êàòî Reference è ñúîòâåòíî âñè÷êè êëàñîâå, ôóíêöèè è ò.í. òè ñå ïîÿâÿâàò â Object Browser-à
. Çà äà ãî äîáàâèø òàêà îáà÷å DLL òðÿáâà äà å íàïèñàí íà C++ .NET, à êëàñîâåòå äà ñà managed. Ìîÿò ïðîáëåì áåøå êàê äà âèêàì ôóíêöèè è êàê äà ïðåäàâàì ïðîìåíëèâè êúì è îò DLL-à. È âñè÷êî áåøå åñòåñòâåíî îò ôàêòà, ÷å ñúì íàïúëíî áîñ â C++ .NET 
@anrieff: Àìè ïðàâè ñå ìàðøàëèíã, íå ìîæåëî áåç íåãî, êàòî ñàìî ïðè char* <-> String^ èìà âðúòêà, èíà÷å â äðóãèòå ñëó÷àè âñè÷êî ñè ñå ïðàâè àâòîìàòè÷íî.
Ïðèìåðíî...
Unmanaged -> Managed:
Managed -> Unmanaged( ïðèìåð îò MSDN ):Code:char* str3 = "Unmanaged string"; String^ res = Marshal::PtrToStringAnsi( (IntPtr)str3 ); // => res = "Unmanaged String"
Âðúùàíåòî íà managed string êàòî ðåçóëòàò íà ôóíêöèÿ ñè å ñúùîòî, êàêòî â C++.Code:// Create a managed string. String^ managedString = "Managed String"; // Marshal the managed string to unmanaged memory. char* stringPointer = (char*) Marshal::StringToHGlobalAnsi(managedString ).ToPointer(); printf( stringPointer ); // "Managed String" // Always free the unmanaged string. Marshal::FreeHGlobal(IntPtr(stringPointer));
À èíà÷å ïîäàâàíåòî íà ïàðàìåòúð ñ ðåôåðåíöèÿ å ïî-ðàçëè÷íî, çàùîòî â C++ .NET íÿìà out, êàêòî å ïîçíàò â C#:
Êîä â C++ .NET
È ñúîòâåòíî òîâà ñå âèêà îò C# ïî ñëåäíèÿ íà÷èí:Code:void MyClass::func( [Runtime::InteropServices::Out] String^ %param ) { param = "new value"; ... }
Code:MyClass var = new MyClass(); string param = "managed string"; var.func( out param );
Òîâà å, êîåòî ìå ìú÷åøå öÿë äåí
. Ïðîñòî îò ÷åòåíå íà ìíîãî ôîðóìè ïî òîçè âúïðîñ áÿõ èçïàäíàë â òîòàëíà çàáëóäà. Àêî åäèí ïðèÿòåë íå ìè áåøå îáÿñíèë íåùàòà, êîé çíàå äîêúäå ùÿõ äà ñòèãíà...
.
-
14th September 2009 03:44 #5
Åõ, òåçè âèçóàëíè ñðåäè, âñè÷êî çàðàäè Object Browser-a
Áÿõ ãîòîâ ñ êîøíèöàòà óêàçàòåëè êúì ôóíêöèè â êðàåí ñëó÷àé. Àç ïðàâÿ îáðàòíoòî ñàìîáè÷óâàíå ñåãà - èìïëåìåíòèðàì COM îáåêò íà C 
Èçâèíåòå çà òðîëåíåòî, ïðîñòî ìè ñå ïðèêàçâà çà òàêèâà íåùà
Íå õðàíåòå òðîëà!
EVGA X299 FTW K|i9-7960X@4.7|4x8 Patriot Viper Steel 4000|GTX 1660 Ti|970 EVO 1 TB|Seasonic Focus GX-1000|Xigmatek Elysium|Êèëî è ïîëîâèíà âîäà
Rampage IV Extreme BE|E5-1680v2@4.7|4x4 HyperX 1866|Cougar Aqua 240|GTX 1050 Ti|970 EVO 1/4 TB|CM 850 SilentPro|HAF-X|Áåç èñòèíñêî âîäíî
-
14th September 2009 13:07 #6
@genn ïîíåæå êàçà, ÷å ðàçïîëàãàø ñúñ C++ îáâèâêà íà C áèáëèîòåêà àç òè ïðåäëîæèõ äà çàðåæåø îáâèâêàòà íà C++ è äà ñè íàïðàâèø òàêàâà íà C#. Íî êàêòî è äà å ðàäâàì ñå, ÷å ñè íàìåðèë ðàçðåøåíèå íà ïðîáëåìà.
-
14th September 2009 14:42 #7
ñèìî, ïðàâ ñè ... íå çíàì êàêâî ñúì ãëåäàë
.
Íî òàêà èëè èíà÷å äà çàðåæà C++ îáâèâêàòà íå å âàðèàíò âå÷å, ïðîñòî çàùîòî ìè îòèäå ìíîãî âðåìå çà íåÿ è å ïî÷òè ãîòîâà.




Reply With Quote
Lenovo ThinkPad 15 èëè IdeaPad 15
5th May 2023, 22:16 in Ìîáèëíè êîìïþòðè