2009-04-08 10 views
8

मैंने सी # में एक डीएलएल बनाया है। अब मैं उस डीएलएल में कार्यों को कॉल करने के लिए R Environment का उपयोग करना चाहता हूं। आर पर्यावरण अप्रबंधित सी/सी ++ डीएलएल को कॉल करने का समर्थन करता है लेकिन .NET DLL में नहीं। तो मेरा सवाल यह है कि, क्या मैं सी/सी ++ डीएलएल से सी # डीएलएल में फ़ंक्शन कॉल कर सकता हूं? यदि हां, तो क्या आपके पास यह करने के बारे में जानकारी का एक लिंक है?क्या आप सी डी डीएल से सी # डीएलएल कॉल कर सकते हैं?

उत्तर

9

ऐसा करने का सबसे आसान तरीका यह है कि आपके सी # डीएलएल में सी # कक्षाओं में से एक को COM ऑब्जेक्ट के रूप में बेनकाब करना है, और उसके बाद अपने सी/सी ++ डीएलएल से इसका एक उदाहरण बनाएं। यदि यह स्वीकार्य विकल्प नहीं है, तो आपको एक मिश्रित-मोड C++ DLL बनाना होगा (जिसमें प्रबंधित और अप्रबंधित कोड दोनों शामिल हैं)। आपका सी/सी ++ डीएलएल आपके मिश्रित मोड डीएलएल में निर्यात किए गए कार्यों को कॉल कर सकता है, जो आपके सी # कक्षा में कॉल को आगे बढ़ा सकता है।

+0

वह मिश्रित मोड सी ++ डीएलएल लगता है जैसे यह चाल करेगा - मैंने बस वीएस -2008 का उपयोग करके मिश्रित मोड डीएलएल प्रोजेक्ट बनाने के लिए उपलब्ध टेम्पलेट्स पर एक नज़र डाली है लेकिन एक को नहीं देखते हैं। मिश्रित मोड डीएलएल शुरू करने के बारे में आप कैसे जाएंगे? – Guy

+0

यदि आप एक नई सी ++ कक्षा पुस्तकालय बनाते हैं, जो एक सी ++ .NET DLL प्रोजेक्ट बनाता है। जब तक "सामान्य भाषा रनटाइम समर्थन" सेटिंग "सामान्य भाषा रनटाइम समर्थन (/ clr)" पर सेट की जाती है, तो आप प्रोजेक्ट में प्रबंधित और अप्रबंधित कोड दोनों का उपयोग करने के लिए स्वतंत्र हैं। – Andy

3

यह लेख आपको बाहर मदद कर सकता है:

CLR Hosting APIs (MSDN)

अपडेट किया गया: एक उपकरण mergebin कहा जाता है कि साथ जहाजों .NET SQLite wrapper आप एक मिश्रित मोड देशी/प्रबंधित DLL बनाने के लिए उपयोग कर सकते हैं। से स्रोत कोड ले लो:

SQLite for ADO.NET 2.0 (SourceForge)

आप bin\tools फ़ोल्डर में exe मिल जाएगा।

केवी

+0

लिंक केवी के लिए धन्यवाद - दिलचस्प पढ़ने। – Guy

0

यह वास्तव में बहुत आसान है। अपने .Net प्रोजेक्ट में "UnmanagedExports" पैकेज जोड़ने के लिए बस NuGet का उपयोग करें। विवरण के लिए https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports देखें।

आप फिर COM परत करने के बिना सीधे निर्यात कर सकते हैं। यहां नमूना सी # कोड है:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.InteropServices; 
using System.Text; 
using System.Threading.Tasks; 
using RGiesecke.DllExport; 

class Test 
{ 
    [DllExport("add", CallingConvention = CallingConvention.Cdecl)] 
    public static int TestExport(int left, int right) 
    { 
     return left + right; 
    } 
} 

आर नियमित सी डीएल की तरह TextExport लोड करने में सक्षम होना चाहिए।

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