Injecting Managed DLL into .net 4.0 Application -
मैंने एक बूटलोडर डीएलएल (सी ++) का प्रयोग करते हुए सफल डीएलएल के शुद्ध 3.5 अनुप्रयोग में इंजेक्ट किया है और फिर मेरे "पेलोड" डीएलएल (सी #)।
जब मैं कोशिश करता हूं और ऐसा एक .net 4.0 अनुप्रयोग में करता हूं तो हमेशा क्रैश हो जाता है।
बूटलोडर C ++:
# "MSCorEE.h" शून्य StartTheDotNetRuntime () शामिल करें {// CLR रनटाइम से बाइंड करें .. ICLRRuntimeHost * pClrHost = NULL; HRESULT घंटा = कोरबिन्दतोरमटाइमएक्स (शून्य, एल "wks", 0, CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (PVOID *) और पीएलएलआरहोस्ट); Hr = pClrHost- & gt; प्रारंभ (); // ठीक है, सीएलआर ऊपर और इस (पहले मूल) प्रक्रिया में चल रहा है। // अब हमारे प्रबंधित सी # कक्षा पुस्तकालय पर एक विधि कॉल करें। DWORD dwRet = 0; Hr = pClrHost- & gt; ExecuteInDefaultAppDomain (एल "पेलोड डीएलएल", एल "मायनामस्पेस। मायक्लास", एल "मायमथिप", एल "मायपैमेटर", और डूआरएटी); // वैकल्पिक रूप से सीएलआर रनटाइम बंद करें (हम इसे भी चल सकते हैं) एचआर = पीएलएल-होस्ट- & gt; स्टॉप (); // साफ करने के लिए मत भूलना pClrHost- & gt; रिलीज (); } पेलोड सी #:
सिस्टम का उपयोग कर; System.Collections.Generic का उपयोग कर; System.Linq का उपयोग कर; System.Text का उपयोग कर; System.Windows का उपयोग कर फार्म; नामस्थान MyNamespace {सार्वजनिक वर्ग MyClass {// इस विधि को स्थानीय प्रक्रिया में लक्ष्यित प्रक्रिया के अंतर्गत बुलाया जाएगा ... सार्वजनिक स्थिर इंट मायमथिप (स्ट्रिंग प्वॉज़अर्जमेंट) {संदेशबॉक्स। शो ("हैलो वर्ल्ड"); वापसी 0; }}} मैंने नीचे निदान का उपयोग करने की कोशिश की है, लेकिन कोई लाभ नहीं, कोई विचार? ठीक है ??:
hr = pMetaHost- & gt; GetRuntime (एल "v4.0.30319", आईआईडी_आईसीएलआरआरंटमैन इन्फो, (एलपीवीओआईडी *) और एलपीआरटाइमइन्फो);
इंटरफ़ेस .NET 4.0 के साथ बदल दिया गया है। CorBindToRuntimeEx का उपयोग करने के बजाय आपको नये ICLRMetaHost का उपयोग करना चाहिए। कोड निम्न की तरह दिख सकता है (बिना त्रुटि की जाँच के): < प्री> आईसीएलआरएमटाहोस्ट * पेमेटाहोस्ट = नल; CLRCreateInstance (CLSID_CLRMetaHost, IID_ICLRMetaHost, (एलपीवीओआईडी *) और पमैटाहोस्ट); आईसीएलआरआरंटइनमॉन्फ़ो * पट्रमटाइमइन्फ़ो = नल; पीएमएटीहोस्ट- & gt; गेटट्रीमटाइम (एल "v4.0.30319", आईआईडी_आईसीएलआरआरंटमैन इन्फो, (एलपीवीओआईडी *) और पट्रन्टाइम इन्फो); आईसीएलआरआरिंटाइमहोस्ट * pClrRuntimeHost = NULL; PRuntimeInfo- & gt; GetInterface (CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (एलपीवीओआईडी *) और pClrRuntimeHost); pClrRuntimeHost- & gt; प्रारंभ ();
Comments
Post a Comment