एकल विधानसभा प्रबंधित और अप्रबंधित कोड रविवार, 4 फरवरी, 2007
नेट डेवलपर्स की तैनाती XCOPY तैनाती से प्यार है। और वे एकल असेंबली घटकों से प्यार करते हैं। कम से कम मैं हमेशा थोड़े असहज महसूस करता हूं, अगर मुझे कुछ घटक का उपयोग करना है और उस घटक की मुख्य असेंबली के साथ फ़ाइलों की एक सूची याद रखने की आवश्यकता है। तो जब मुझे हाल ही में एक प्रबंधित कोड घटक विकसित करना पड़ा और उसे सी डीएलएल से कुछ अप्रबंधित कोड के साथ बढ़ाया गया था (थक्स से मार्कस हेज इस के लिए मेरी मदद करने के लिए!), मैंने सोचा कि दो डीएलएल को तैनात करना आसान कैसे बनाएं । अगर यह केवल दो विधानसभाएं थीं तो मैं केवल एक फ़ाइल में उन्हें पैक करने के लिए ILmerge का उपयोग कर सकता था। लेकिन यह प्रबंधित और साथ ही अप्रबंधित डीएलएल के साथ मिश्रित कोड घटकों के लिए काम नहीं करता है।
तो here's क्या मैं एक समाधान के लिए के साथ आया था:
मैं शामिल जो कुछ DLLs मैं अपने component's साथ एम्बेड किए गए संसाधन के रूप में मुख्य विधानसभा को तैनात करना चाहते हैं। फिर मैंने नीचे दिए गए डीएलएल को निकालने के लिए एक क्लास कन्स्ट्रक्टर स्थापित किया। क्लास सीटीओ को प्रत्येक ऐपडोमेन के भीतर सिर्फ एक बार बुलाया जाता है, इसलिए यह एक लापरवाह ओवरहेड है, मुझे लगता है।
namespace MyLib
{
public class MyClass
{
static MyClass()
{
ResourceExtractor.ExtractResourceToFile("MyLib.ManagedService.dll", "managedservice.dll");
ResourceExtractor.ExtractResourceToFile("MyLib.UnmanagedService.dll", "unmanagedservice.dll");
}
...
इस उदाहरण में मैं संसाधनों के रूप में दो DLLs, एक होने के एक अप्रबंधित कोड DLL, और एक एक प्रबंधित कोड DLL (सिर्फ प्रदर्शन के उद्देश्य से) किया जा रहा है, दिखाने के लिए, कैसे इस तकनीक कोड दोनों प्रकार के लिए काम करता है शामिल ।
अपनी खुद की फाइलों में DLLs निकालने के लिए कोड सरल है:
public static class ResourceExtractor
{
public static void ExtractResourceToFile(string resourceName, string filename)
{
if (!System.IO.File.Exists(filename))
using (System.IO.Stream s = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Create))
{
byte[] b = new byte[s.Length];
s.Read(b, 0, b.Length);
fs.Write(b, 0, b.Length);
}
}
}
इस तरह एक प्रबंधित कोड विधानसभा के साथ कार्य करना हमेशा की तरह एक ही है - लगभग। आप इसे अपने घटक की मुख्य परियोजना (यहां: MyLib) में संदर्भित करते हैं (यहां: प्रबंधित Service.dll), लेकिन प्रतिलिपि स्थानीय संपत्ति को गलत पर सेट करें। इसके अतिरिक्त आप असेंबली में मौजूदा आइटम के रूप में लिंक करते हैं और एंबेडेड संसाधन में बिल्ड एक्शन सेट करते हैं।
अप्रबंधित कोड (यहां: UnmanagedService.dll) के लिए आप बस मौजूदा आइटम के रूप में डीएलएल में लिंक करते हैं और एंबेडेड संसाधन में बिल्ड एक्शन सेट करते हैं। अपने कार्यों तक पहुंचने के लिए सामान्य रूप से DllImport विशेषता का उपयोग करें, उदा।
[DllImport("unmanagedservice.dll")] public extern static int Add(int a, int b);
यह है! जैसे ही आप स्थिर सीटीआर के साथ कक्षा का पहला उदाहरण बनाते हैं, एम्बेडेड डीएलएल स्वयं की फाइलों में निकाले जाते हैं और उपयोग करने के लिए तैयार होते हैं जैसे कि आप उन्हें अलग फ़ाइलों के रूप में तैनात करते हैं। जब तक आपके पास निष्पादन निर्देशिका के लिए लेखन अनुमतियां हों, तब तक यह आपके लिए ठीक काम करेगी। कम से कम प्रोटोटाइपिकल कोड के लिए मुझे लगता है कि एकल असेंबली परिनियोजन का यह तरीका काफी सुविधाजनक है।
का आनंद लें!
http://weblogs.asp.net/ralfw/archive/2007/02/04/single-assembly-deployment-of-managed-and-unmanaged-code.aspx
आप BoxedAppPacker या BoxedApp एसडीके का उपयोग करना चाहिए। यह मदद करनी चाहिए। – MastAvalons
http://stackoverflow.com/questions/666799/embedding-unmanaged-dll-into-a-managed-c-sharp-dll/11038376#11038376 –