2013-01-10 17 views
5

से रिवर्स PInvoke मैं वर्तमान में एक अप्रबंधित सी ++ ऐप से सी # डीएलएल से एक फ़ंक्शन कॉल करने का प्रयास कर रहा हूं।देशी सी ++

वेब और घंटे पर घंटों की खोज करने के बाद, मैंने पाया कि मेरे पास कुछ विकल्प हैं।

मैं COM, DllExport का उपयोग कर सकता हूं, या प्रतिनिधि के साथ रिवर्स PInvoke का उपयोग कर सकते हैं। आखिरी बार मुझे सबसे ज्यादा आकर्षक लग रहा था, इसलिए एसओ खोजने के बाद मैंने here समाप्त कर दिया।

यह कहता है कि लेख दिखाता है कि रिवर्स PInvoke का उपयोग कैसे करें, लेकिन ऐसा लगता है कि C# कोड को पहले C++ Dll आयात करना होगा, इससे पहले कि इसका उपयोग किया जा सके।

मुझे पहले सी # एप चलाने के बिना, मेरे सी # डीएल कार्यों को कॉल करने के लिए सी ++ का उपयोग करने में सक्षम होना चाहिए।

शायद रिवर्स PInvoke ऐसा करने का तरीका नहीं है, लेकिन जब मैं निम्न स्तर की सामग्री की बात करता हूं तो मैं काफी अनुभवहीन हूं, इसलिए यह करने के तरीके पर कोई संकेतक या सुझाव बहुत अच्छा होगा।

कड़ी में कोड है

सी #

using System.Runtime.InteropServices; 

public class foo  
{  
    public delegate void callback(string str); 

    public static void callee(string str)  
    {  
     System.Console.WriteLine("Managed: " +str);  
    } 

    public static int Main()  
    {  
     caller("Hello World!", 10, new callback(foo.callee));  
     return 0;  
    } 

    [DllImport("nat.dll",CallingConvention=CallingConvention.StdCall)]  
    public static extern void caller(string str, int count, callback call);  
} 

सी ++

#include <stdio.h>  
#include <string.h> 

typedef void (__stdcall *callback)(wchar_t * str);  
extern "C" __declspec(dllexport) void __stdcall caller(wchar_t * input, int count, callback call)  
{  
    for(int i = 0; i < count; i++)  
    {  
     call(input);  
    }  
} 
+2

सरल UnmanagedExports है: https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports –

+0

, क्या आप क्या करना चाहते C++ से एक सी # dll की मेजबानी है, तो आप दिखती थी [ यहाँ] [1]? [1]: http://stackoverflow.com/questions/3799907/using-c-sharp-dll-in-project-c – plinth

उत्तर

8

मेह, बस अपने खुद के CLR मेजबान ऊपर स्पिन और दिखाए जाते हैं तो आपको टी की जरूरत है o:

#include <mscoree.h> 
#include <stdio.h> 
#pragma comment(lib, "mscoree.lib") 

void Bootstrap() 
{ 
    ICLRRuntimeHost *pHost = NULL; 
    HRESULT hr = CorBindToRuntimeEx(L"v4.0.30319", L"wks", 0, CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (PVOID*)&pHost); 
    pHost->Start(); 
    printf("HRESULT:%x\n", hr); 

    // target method MUST be static int method(string arg) 
    DWORD dwRet = 0; 
    hr = pHost->ExecuteInDefaultAppDomain(L"c:\\temp\\test.dll", L"Test.Hello", L"SayHello", L"Person!", &dwRet); 
    printf("HRESULT:%x\n", hr); 

    hr = pHost->Stop(); 
    printf("HRESULT:%x\n", hr); 

    pHost->Release(); 
} 

int main() 
{ 
    Bootstrap(); 
} 
+0

धन्यवाद बहुत बहुत, मैं वास्तव में कोड उदाहरण की सराहना करते हैं। एकमात्र समस्या यह है कि यह mscoree.h नहीं ढूंढ सकता है, और यह प्रोग्राम फ़ाइलों में मेरे एसडीके पथ में नहीं है, क्या आप जानते हैं कि यह हेडर कहां होना चाहिए या मैं इसे कहां प्राप्त कर सकता हूं? एक बार फिर धन्यवाद। –

+0

@ बाली-सी 100% निश्चित नहीं है, लेकिन मुझे लगता है कि यह ढांचा एसडीके का हिस्सा है। आप इसे एमएसडीएन से पकड़ सकते हैं। – JerKimball

+0

धन्यवाद, मैंने इसे पाया, लेकिन सभी फाइलों की प्रतिलिपि बनाने के बाद यह शिकायत कर रहा था कि यह शीर्षकों में त्रुटियों के पूरे लोड के साथ आया था। मैं कोड :: ब्लॉक का उपयोग कर रहा हूँ, क्या यह ठीक है? या मुझे वीएस का उपयोग करना चाहिए? धन्यवाद! –

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