2008-11-05 9 views

उत्तर

31

जबकि आयरनआरबी आपके .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 डीएल पहले से ही कॉम विजिबल है, या यदि ऐसा नहीं है, तो आपके पास इसे पुन: संकलित करने की क्षमता है। यदि इनमें से कोई भी चीज़ सत्य नहीं है, तो आपको अन्य विकल्पों को देखना पड़ सकता है।

शुभकामनाएं!

+0

धन्यवाद! मैं यह देखने के लिए कि क्या मैं इस समाधान को कार्यान्वित कर सकता हूं, मैं डीएल की कॉमविज़िबल प्रॉपर्टी की जांच करूंगा। –

+0

उपर्युक्त कोड का उपयोग करके मैं नेट डेल कोड तक पहुंच रहा हूं और बहुत अच्छा कर रहा हूं लेकिन मैं जानना चाहता हूं कि इस कार्य को कैसे बंद करना है ... अगर मैं इसे अक्सर उपयोग करना चाहता हूं .... अगर मैं उसी कोड का उपयोग करता हूं तो मुझे अक्सर इसका मतलब नहीं होगा फिर ... क्या ऑब्जेक्ट को बंद/मारने का कोई तरीका है? – Jeyavel

+0

ऑब्जेक्ट को मारकर आपका क्या मतलब है? .NET रनटाइम आपके लिए COM ऑब्जेक्ट्स का जीवनकाल प्रबंधित करता है। जब कचरा कलेक्टर चलता है तो यह जांच करेगा और देखें कि कोई भी .NET कोड COM ऑब्जेक्ट का संदर्भ दे रहा है, और यदि नहीं, तो यह इसे साफ़ कर देगा। अगर ।नेट कोड * अभी भी इसका संदर्भ दे रहा है, फिर इसे साफ़ करने के लिए एक त्रुटि होगी। –

0

यदि आप IronRuby (.NET पर रूबी कार्यान्वयन) का उपयोग करते हैं तो यह सक्षम होना चाहिए। यदि आप पहले से ही नेट का उपयोग कर रहे हैं और रूबी को आजमा सकते हैं तो आप IronRuby में देखना चाहेंगे।

IronRuby के बाहर मुझे यकीन नहीं है। मैंने खुद रूबी का उपयोग नहीं किया है, इसलिए मुझे नहीं पता कि यह किस प्रकार की चीजों में सक्षम है।

2

आप उपयोग करना 'सामान्य' माणिक आप कॉम के माध्यम से जाने के लिए सक्षम हो सकता है (के बाद से मैं IronRuby पूरी तरह से अभी तक आतंक विरोधी चलाता है लगता है न) चाहते हैं - यानी

"Your Ruby Code" -> RubyCOM -> "COM-Callable Wrappers" -> "Your .NET objects" 

RubyCom

कि थोड़ा जटिल है हालांकि।

संपादित करें: जवाब

1

एक और बात में कहीं बेहतर COM- आधारित विकल्प - यह एक सर्विस ओरिएंटेड आर्किटेक्चर बिंदु से अधिक इसके बारे में सोचने के लिए बेहतर हो सकता है। क्या आप उस .NET DLL को ले सकते हैं और इसे एक सेवा के रूप में बेनकाब कर सकते हैं?

दृश्यों के पीछे, आप सी में रूबी मॉड्यूल लिख सकते हैं, ताकि आप जो भी चाहते हैं उसे करने के लिए आप हमेशा एक इंटरऑप लिख सकें। यह विंडोज प्लेटफॉर्म पर आपकी तैनाती को सीमित कर देगा, हालांकि (मैंने रूबी-> इंटरऑप-> मोनो की कोशिश नहीं की है)

यहां एक प्रेजेंटेशन है जिसे मैंने कुछ साल पहले Ruby for C# Developers कहा था। यह थोड़ा दिनांकित है (यह जॉन लैम की परियोजना आयरन रूबी में तब्दील होने से पहले था), लेकिन थोड़ा सा मदद कर सकता है।

+0

बेनकाब एक SOA सेवा के रूप में नेट dll जाने के लिए एक रास्ता है FFI उपयोग करते हैं, लेकिन मैं ऐसा करने का सुरक्षा के मुद्दों की जांच करनी होगी। –

0

हालांकि यह एक मृत परियोजना AFAIK है, लेकिन आप जॉन लैम (जो अब आयरन रूबी के प्रभारी हैं) द्वारा पिछले RubyCLR project को एक रोचक व्यक्ति मिल सकता है।

0

आप एक साथ IronRuby साथ ASP.NET MVC में रुचि रखते हैं, आप जिमी से इस स्रोत कोड की जाँच करने के लिए अपने आप को मिल सकता है - http://github.com/jschementi/ironrubymvc/tree/master

का आनंद लें!

3

तुम भी एक देशी लिख सकते हैं -> सी # आवरण DLL प्रबंधित का उपयोग सी ++

निर्यात सभी कार्यों के रूप में सी DLL में, उदाहरण के लिए कहता है आप चाहते हैं

extern "C" __declspec (dllexport) void CallManagedMethod() { 
    Something^ myManagedObject ... 
} 

तो रूबी से कि DLL कॉल करने के लिए https://github.com/ffi/ffi

संबंधित मुद्दे