मुझे एक परियोजना में RoR का उपयोग/सीखने में रूचि है जहां मुझे .NET dll का उपयोग करना है। क्या रूबी एक .NET डीएल आयात करने में सक्षम है?रूबी एक .NET डीएल आयात कर सकते हैं?
उत्तर
जबकि आयरनआरबी आपके .NET डीएल (यह सचमुच कोई कोड नहीं होगा) से बात करने का संक्षिप्त काम करेगा, इसे माइक्रोसॉफ्ट द्वारा छोड़ा गया था, और इसे कभी भी पर्याप्त ओपन सोर्स समुदाय नहीं मिला वह घटना मैं इन दिनों
COM समाधान के संबंध में इसकी अनुशंसा नहीं करता, यह वास्तव में जाने का एक अच्छा तरीका हो सकता है।
आपको रूबीकॉम लाइब्रेरी की आवश्यकता नहीं है - जो अन्य COM ऑब्जेक्ट्स को रूबी कोड में कॉल करने देता है। रूबी से COM ऑब्जेक्ट्स लोड करने के लिए, आपको केवल win32ole
लाइब्रेरी की आवश्यकता है, जो विंडोज रूबी पर मानक लाइब्रेरी के हिस्से के रूप में आता है।
चाहे आप COM से डीएलएल लोड कर सकें या नहीं, तो निर्भर करेगा कि .NET डीएल को 'कॉम विजिबल' के रूप में बनाया गया था। .NET Framework ComVisibleAttribute
को परिभाषित करता है, जिसे किसी भी असेंबली या किसी असेंबली के भीतर विशिष्ट कक्षाओं पर लागू किया जा सकता है। यदि यह पूरी असेंबली या किसी भी कक्षा के लिए सत्य पर सेट है, तो डीएलएल पहले से ही किसी भी रैपर कोड के बिना COM से कॉल करने योग्य होगा।
यहां एक परीक्षण है जो मैंने किया था।
नया .NET डीएलएल प्रोजेक्ट (क्लास लाइब्रेरी) बनाएं। यहाँ एक उदाहरण वर्ग मैं प्रयोग किया जाता है:
using System;
using System.IO;
namespace ComLib
{
public class LogWriter
{
public void WriteLine(string line)
{
using(var log = new StreamWriter(File.OpenWrite(@"c:\log.file")))
{
log.WriteLine(line);
}
}
}
}
अब, दृश्य स्टूडियो परियोजना के तहत, वहाँ एक निर्देशिका Properties
कहा जाता है जो AssemblyInfo.cs
होता है।इस फ़ाइल में, निम्नलिखित
[assembly: ComVisible(false)]
गलत को गलत में बदलें। अब
[ComVisible(true)]
public class LogWriter ....
: आप कॉम के संपर्क में विधानसभा में हर वर्ग नहीं करना चाहते हैं , तो आप यह AssemblyInfo.cs
में गलत सेट है, छोड़ सकते हैं और बदले में प्रत्येक वर्ग आप को बेनकाब करना चाहते ऊपर रख दिया इस तरह डीएलएल प्रोजेक्ट पर राइट क्लिक करें, और पॉपअप मेनू से, 'गुण' चुनें। अनुभागों की सूची में, Build
स्क्रॉल करें, और 'COM इंटरऑप के लिए रजिस्टर' चेकबॉक्स पर निशान लगाएं चुनें। अब जब आप इस डीएलएल को संकलित करते हैं, तो विज़ुअल स्टूडियो रजिस्ट्री में COM जानकारी लोड करने के लिए निरंतर सामग्री करेगा। ध्यान दें कि अगर आप विस्टा पर हैं तो आपको काम करने के लिए वीएस को व्यवस्थापक के रूप में चलाने की जरूरत है।
अब यह किया गया है, यह आपके डीएल को पुन: संकलित करें, और फिर एक नई रूबी फ़ाइल बनाएं।
इस माणिक फ़ाइल में ऐसा करते हैं:
require 'win32ole'
lib = WIN32OLE.new('[Solution name].ComLib.LogWriter')
lib.WriteLine('calling .net from ruby via COM, hooray!')
कहाँ [समाधान नाम] समाधान आपने अभी बनाया के नाम से प्रतिस्थापित किया जाना है (डिफ़ॉल्ट: "ClassLibrary1")
रूबी कि रूबी फ़ाइल, और प्रतिष्ठा! आपको देखना चाहिए कि पाठ c:\log.file
पर लिखा गया है।
इस समाधान के साथ एक समस्या यह है कि यह आवश्यक है कि .NET डीएल पहले से ही कॉम विजिबल है, या यदि ऐसा नहीं है, तो आपके पास इसे पुन: संकलित करने की क्षमता है। यदि इनमें से कोई भी चीज़ सत्य नहीं है, तो आपको अन्य विकल्पों को देखना पड़ सकता है।
शुभकामनाएं!
यदि आप IronRuby (.NET पर रूबी कार्यान्वयन) का उपयोग करते हैं तो यह सक्षम होना चाहिए। यदि आप पहले से ही नेट का उपयोग कर रहे हैं और रूबी को आजमा सकते हैं तो आप IronRuby में देखना चाहेंगे।
IronRuby के बाहर मुझे यकीन नहीं है। मैंने खुद रूबी का उपयोग नहीं किया है, इसलिए मुझे नहीं पता कि यह किस प्रकार की चीजों में सक्षम है।
आप उपयोग करना 'सामान्य' माणिक आप कॉम के माध्यम से जाने के लिए सक्षम हो सकता है (के बाद से मैं IronRuby पूरी तरह से अभी तक आतंक विरोधी चलाता है लगता है न) चाहते हैं - यानी
"Your Ruby Code" -> RubyCOM -> "COM-Callable Wrappers" -> "Your .NET objects"
कि थोड़ा जटिल है हालांकि।
संपादित करें: जवाब
एक और बात में कहीं बेहतर COM- आधारित विकल्प - यह एक सर्विस ओरिएंटेड आर्किटेक्चर बिंदु से अधिक इसके बारे में सोचने के लिए बेहतर हो सकता है। क्या आप उस .NET DLL को ले सकते हैं और इसे एक सेवा के रूप में बेनकाब कर सकते हैं?
दृश्यों के पीछे, आप सी में रूबी मॉड्यूल लिख सकते हैं, ताकि आप जो भी चाहते हैं उसे करने के लिए आप हमेशा एक इंटरऑप लिख सकें। यह विंडोज प्लेटफॉर्म पर आपकी तैनाती को सीमित कर देगा, हालांकि (मैंने रूबी-> इंटरऑप-> मोनो की कोशिश नहीं की है)
यहां एक प्रेजेंटेशन है जिसे मैंने कुछ साल पहले Ruby for C# Developers कहा था। यह थोड़ा दिनांकित है (यह जॉन लैम की परियोजना आयरन रूबी में तब्दील होने से पहले था), लेकिन थोड़ा सा मदद कर सकता है।
बेनकाब एक SOA सेवा के रूप में नेट dll जाने के लिए एक रास्ता है FFI उपयोग करते हैं, लेकिन मैं ऐसा करने का सुरक्षा के मुद्दों की जांच करनी होगी। –
हालांकि यह एक मृत परियोजना AFAIK है, लेकिन आप जॉन लैम (जो अब आयरन रूबी के प्रभारी हैं) द्वारा पिछले RubyCLR project को एक रोचक व्यक्ति मिल सकता है।
आप एक साथ IronRuby साथ ASP.NET MVC में रुचि रखते हैं, आप जिमी से इस स्रोत कोड की जाँच करने के लिए अपने आप को मिल सकता है - http://github.com/jschementi/ironrubymvc/tree/master
का आनंद लें!
तुम भी एक देशी लिख सकते हैं -> सी # आवरण DLL प्रबंधित का उपयोग सी ++
निर्यात सभी कार्यों के रूप में सी DLL में, उदाहरण के लिए कहता है आप चाहते हैं
extern "C" __declspec (dllexport) void CallManagedMethod() {
Something^ myManagedObject ...
}
तो रूबी से कि DLL कॉल करने के लिए https://github.com/ffi/ffi
- 1. मेवेन 'आयात' संसाधन निर्भरता कर सकते हैं?
- 2. पायथन आयात डीएल
- 3. जा सकते हैं कोड विंडोज़ में डीएल उत्पन्न कर सकते हैं या सी ++/सी # कॉल गोलांग कोड कर सकते हैं?
- 4. रूबी को प्रतिस्थापित कर सकते हैं node.js?
- 5. क्या आप 3.5 प्रोजेक्ट में .NET 4.0 डीएल का उपयोग कर सकते हैं?
- 6. अजगर के साथ SQLite आयात कर सकते हैं नहीं 2.6
- 7. क्या आप सी डी डीएल से सी # डीएलएल कॉल कर सकते हैं?
- 8. रूबी रत्न: आयात
- 9. एक डीएल
- 10. ImportError: आयात नहीं कर सकते नाम काउंटर
- 11. रूबी रैंड() चर स्वीकार नहीं कर सकते हैं?
- 12. मैं hash.has_key कर सकते हैं? ('वीडियो' या 'video2') (रूबी)
- 13. नाम पैटर्न आयात नहीं कर सकते
- 14. आयात नहीं कर सकते नाम HttpResponse
- 15. क्या JRuby मूल रूबी रत्न का उपयोग कर सकते हैं?
- 16. ग्रहण एक "गतिशील वेब अनुप्रयोग" के रूप में एक मेवेन वेब परियोजना आयात कर सकते हैं?
- 17. क्या आप रूबी में अर्धविराम का उपयोग कर सकते हैं?
- 18. एफएसएक्स स्क्रिप्ट एक डीएल संदर्भित कई डीएल
- 19. क्या कर सकते हैं कि sed क्या कर सकते हैं?
- 20. एक डीएल
- 21. क्या आप IronPython में .NET ऑब्जेक्ट टाइप कर सकते हैं?
- 22. एक डीएल
- 23. एक डीएल
- 24. स्ट्रिंग कर सकते हैं .plit() कभी वापस शून्य? (.net)
- 25. रूबी फाइबर समवर्ती हो सकते हैं?
- 26. Mercurial एक रिवर्स-पैच कर सकते हैं?
- 27. std कर सकते हैं :: वेक्टर एक सरणी
- 28. क्या एक डीएल
- 29. वीएसआईएक्स - एक संदर्भित डीएल
- 30. 32 बिट डीएल 64 बिट में आयात करना। नेट एप्लिकेशन
धन्यवाद! मैं यह देखने के लिए कि क्या मैं इस समाधान को कार्यान्वित कर सकता हूं, मैं डीएल की कॉमविज़िबल प्रॉपर्टी की जांच करूंगा। –
उपर्युक्त कोड का उपयोग करके मैं नेट डेल कोड तक पहुंच रहा हूं और बहुत अच्छा कर रहा हूं लेकिन मैं जानना चाहता हूं कि इस कार्य को कैसे बंद करना है ... अगर मैं इसे अक्सर उपयोग करना चाहता हूं .... अगर मैं उसी कोड का उपयोग करता हूं तो मुझे अक्सर इसका मतलब नहीं होगा फिर ... क्या ऑब्जेक्ट को बंद/मारने का कोई तरीका है? – Jeyavel
ऑब्जेक्ट को मारकर आपका क्या मतलब है? .NET रनटाइम आपके लिए COM ऑब्जेक्ट्स का जीवनकाल प्रबंधित करता है। जब कचरा कलेक्टर चलता है तो यह जांच करेगा और देखें कि कोई भी .NET कोड COM ऑब्जेक्ट का संदर्भ दे रहा है, और यदि नहीं, तो यह इसे साफ़ कर देगा। अगर ।नेट कोड * अभी भी इसका संदर्भ दे रहा है, फिर इसे साफ़ करने के लिए एक त्रुटि होगी। –