Results 1 to 7 of 7

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Registered User genn's Avatar
    Join Date: Feb:2003
    Location: Ãåðìàíèÿ
    Posts: 1,215

    Ïðîáëåì ñ âðúçêà C++ <-> C++/CLI

    Â ìîìåíòà íàâëèçàì â C#, êàòî èìàì áàçîâ îïèò ñúñ C++.
    Íàëàãà ìè ñå äà ïîëçâàì åäèí DLL, êîéòî ñúì ïèñàë íà C++( unmanaged ), â C# ïðèëîæåíèå.
    È òóê ñå ïîÿâÿâà C++ .NET, ñ êîåòî íÿìàì àáñîëþòíî íèêàêúâ îïèò. Íÿêîëêî äíè ÷åòà òóòîðèàëè, íî ÷åñòíî êàçàíî ìå îáúðêàõà ïîâå÷å, çàùîòî íàâñÿêúäå äàâàò ïðèìåðè ñ ðàçëè÷åí ñèíòàêñèñ. Óñïÿõ äà ïîäêàðàì DLL-à äà ñå êîìïèëèðà ñ /clr è ìîãà äà ãî ïîëçâàì â C# ïðèëîæåíèåòî áåç ïðîáëåì. Íî íå ìîãà äà ðàçáåðà êîé å íàé-äîáðèÿò íà÷èí äà ïðåäàâàì ïðîìåíëèâè ìåæäó DLL è C# ïðèëîæåíèåòî.
    Íàìåðèõ îáùî êúì 4 íà÷èíà, êàòî íèòî åäèí äîðè íå óñïÿõ äà ïîäêàðàì.
    Â DLL ïîëçâàì unmanaged ïðîìåíëèâè. Â C# ïîäàâàì íà dll-ôóíêöèÿ managed ïðîìåíëèâà, íî íå ìîãà äà ðàçáåðà êàê äà ÿ ïîëçâàì.

     ìîìåíòà ñå ìú÷à ñ ìàðøàëèíã:

    Code:
    void MyClass::func( System::String^ str )
    	{
    		char* str2 = (char*)Marshal::StringToHGlobalAnsi(str).ToPointer();
    
    		printf( str2 ); // works
    
                    // free the memory for str2...
                    // ....
    	}
    è ñúîòâåòíî â C# ãî ïîëçâàì òàêà:

    Code:
    class Start
    {
        public static void Main()
        {
            MyClass var = new MyClass();
    
            string str1 = "managed call";
    
            var.func(str1 );
    
        }
    }
    Òîçè êîä ðàáîòè, íî íå ìè âúðøè íàïúëíî ðàáîòà - áèõ èñêàë äà ìîãà äà ïðîìåíÿ str1 , êàêòî è äà âðúùàì ðåçóëòàò îò ôóíêöèèòå â DLL-à.

    Àêî íÿêîé ìîæå äà ìè îáÿñíè ñ äâå-òðè äóìè êàê íàé-äîáðå äà ïðåäàâàì ïðîìåíëèâè â äâåòå ïîñîêè, çàùîòî ñúì â çàäúíåíà óëèöà ñ òîçè 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.

  2. #2
    ɐ-əpoɔᴉu⋂ ɐí íəÔ anrieff's Avatar
    Join Date: Apr:2004
    Location: Sofia
    Posts: 8,448
    Ååå, åãàòè. Íå äàäå øàíñ äîðè äà ñå îïèòàìå äà òè ïîìîãíåì. Ìíîãî ñè ëîø

    Êàòî ñè ãî îòêðèë, ùå ãî ñïîäåëèø ëè ñ íàñ, íà ìåí ìè ñòàíà èíòåðåñíî ïîíå
    Åòî òàêà ñå ïëîäÿò òå, êàçâàì ñè àç. Ïîä íîñà òè.
    "640K îught to be enough for anybody" - Bill Gates, 1981
    Òåñòîâå íà áàòåðèè::Machine specs::Fract::AGG::ÍåÑåÑúðäè×îâå÷å::Baileys::blog::YouTube channel

  3. #3
    Registered User ñèìî's Avatar
    Join Date: Feb:2006
    Location: Âàðíà
    Posts: 653
    Ìîæåø äà èçïîëçâàø C API-òî äèðåêòíî ïî òîçè íà÷èí:
    DLL
    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
    C#
    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');
            }
        }

  4. #4
    Registered User genn's Avatar
    Join Date: Feb:2003
    Location: Ãåðìàíèÿ
    Posts: 1,215
    @ñèìî: Äà, òîâà å äðóãèÿò âàðèàíò çà âêàðâàíå íà DLL, íî äîñòà ïî-åëåãàíòíî å äà ãî äîáàâèø êàòî Reference è ñúîòâåòíî âñè÷êè êëàñîâå, ôóíêöèè è ò.í. òè ñå ïîÿâÿâàò â Object Browser-à . Çà äà ãî äîáàâèø òàêà îáà÷å DLL òðÿáâà äà å íàïèñàí íà C++ .NET, à êëàñîâåòå äà ñà managed. Ìîÿò ïðîáëåì áåøå êàê äà âèêàì ôóíêöèè è êàê äà ïðåäàâàì ïðîìåíëèâè êúì è îò DLL-à. È âñè÷êî áåøå åñòåñòâåíî îò ôàêòà, ÷å ñúì íàïúëíî áîñ â C++ .NET

    @anrieff: Àìè ïðàâè ñå ìàðøàëèíã, íå ìîæåëî áåç íåãî, êàòî ñàìî ïðè char* <-> String^ èìà âðúòêà, èíà÷å â äðóãèòå ñëó÷àè âñè÷êî ñè ñå ïðàâè àâòîìàòè÷íî.

    Ïðèìåðíî...
    Unmanaged -> Managed:
    Code:
    char* str3 = "Unmanaged string";
    		String^ res = Marshal::PtrToStringAnsi( (IntPtr)str3 ); 
                    // => res = "Unmanaged String"
    Managed -> Unmanaged( ïðèìåð îò MSDN ):
    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));
    Âðúùàíåòî íà managed string êàòî ðåçóëòàò íà ôóíêöèÿ ñè å ñúùîòî, êàêòî â C++.
    À èíà÷å ïîäàâàíåòî íà ïàðàìåòúð ñ ðåôåðåíöèÿ å ïî-ðàçëè÷íî, çàùîòî â C++ .NET íÿìà out, êàêòî å ïîçíàò â C#:

    Êîä â C++ .NET
    Code:
    void MyClass::func( [Runtime::InteropServices::Out] String^ %param )
    {
           param = "new value";
    ...
    }
    È ñúîòâåòíî òîâà ñå âèêà îò C# ïî ñëåäíèÿ íà÷èí:
    Code:
    MyClass var = new MyClass();
    string param = "managed string";
    var.func( out param );

    Òîâà å, êîåòî ìå ìú÷åøå öÿë äåí . Ïðîñòî îò ÷åòåíå íà ìíîãî ôîðóìè ïî òîçè âúïðîñ áÿõ èçïàäíàë â òîòàëíà çàáëóäà. Àêî åäèí ïðèÿòåë íå ìè áåøå îáÿñíèë íåùàòà, êîé çíàå äîêúäå ùÿõ äà ñòèãíà... .

  5. #5
    Áåëûé è ïóøèñòûé Bombera's Avatar
    Join Date: Jul:2001
    Location: Êàçàíëúê 4EVA
    Posts: 13,833
    Åõ, òåçè âèçóàëíè ñðåäè, âñè÷êî çàðàäè 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|Áåç èñòèíñêî âîäíî

  6. #6
    Registered User ñèìî's Avatar
    Join Date: Feb:2006
    Location: Âàðíà
    Posts: 653
    @genn ïîíåæå êàçà, ÷å ðàçïîëàãàø ñúñ C++ îáâèâêà íà C áèáëèîòåêà àç òè ïðåäëîæèõ äà çàðåæåø îáâèâêàòà íà C++ è äà ñè íàïðàâèø òàêàâà íà C#. Íî êàêòî è äà å ðàäâàì ñå, ÷å ñè íàìåðèë ðàçðåøåíèå íà ïðîáëåìà.

  7. #7
    Registered User genn's Avatar
    Join Date: Feb:2003
    Location: Ãåðìàíèÿ
    Posts: 1,215
    ñèìî, ïðàâ ñè ... íå çíàì êàêâî ñúì ãëåäàë .
    Íî òàêà èëè èíà÷å äà çàðåæà C++ îáâèâêàòà íå å âàðèàíò âå÷å, ïðîñòî çàùîòî ìè îòèäå ìíîãî âðåìå çà íåÿ è å ïî÷òè ãîòîâà.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  

Copyright © 1999-2011 Õàðäóåð ÁÃ. Âúçìîæíî å ñúäúðæàíèåòî íà òàçè ñòðàíèöà äà å îáåêò íà àâòîðñêè ïðàâà.
iskamPC.com | mobility.BG | Bloody's Techblog | Êðèïòîâàëóòè è ìàéíèíã | 3D Vision Blog | Ìàãàçèí çà åëåêòðîííè öèãàðè