c# डीएलएल से सी#में C++ फ़ंक्शन कॉल करें-अजीब पैरामीटर




dll com (2)

कुछ सुधार जो मेरे लिए काम करते हैं:

        string inStr = "Value to pass";
        int inSize = inStr.Length;
        StringBuilder outStr = new StringBuilder(255);
        int outSize = 255;

        EncodeFromBufferIN(inStr, inSize, outStr, ref outSize);

सादर।

मेरे अगले हेडर के साथ सी ++ में एक फंक्शन लिखी गई है:

void EncodeFromBufferIN(void* bufferIN,int bufferINSize, unsigned char*  &bufferOUT, int &bufferOUTSize);

मैंने सी # में डीएलएल आयात करके फ़ंक्शन को कॉल करने में सक्षम होने के लिए, इस तरह। एच और। सीपीपी फ़ाइलों को संपादित किया है:

**EncodeFromBufferIN.h**
extern "C" {
     __declspec(dllexport) void EncodeFromBufferIN(void* bufferIN, int bufferINSize, unsigned char*  &bufferOUT, int &bufferOUTSize);
}
**EncodeFromBufferIN.cpp**
extern void EncodeFromBufferIN(void* bufferIN, int bufferINSize, unsigned char*  &bufferOUT, int &bufferOUTSize){
    // stuff to be done
}

लेकिन अब मेरी समस्या यह है कि मुझे नहीं पता कि फ़ंक्शन को C # में कैसे कॉल किया जाए। मैंने सी # में अगला कोड जोड़ लिया है लेकिन यह सुनिश्चित नहीं है कि फ़ंक्शन के पैरामीटर कैसे पास करें।

[DllImport("QASEncoder.dll")]
        unsafe public static extern void EncodeFromBufferIN(void* bufferIN, int bufferINSize, out char[] bufferOUT, out int bufferOUTSize);

बफ़रिन और बफरआउट स्ट्रिंग होने चाहिए, लेकिन अगर मैं फ़ंक्शन को इस तरह बुला रहा हूं:

public string prepareJointsForQAS()
{
   string bufferIN = "0 0 0 0 0";
   char[] bufferOUT;
   int bufferOUTSize;
   EncodeFromBufferIN(bufferIN, bufferIN.Length, bufferOUT, bufferOUTSize);
}

मुझे यह त्रुटि मिलती है: "सर्वश्रेष्ठ अधिभारित विधि मैट्रिक के लिए ... में कुछ अमान्य तर्क हैं"। तो पैरामीटर कैसे पारित हो जाएंगे?


मार्शलिंग सी स्टाइल कॉल के साथ सबसे अच्छा काम करता है इसलिए अपने सार्वजनिक इंटरफ़ेस पर शुद्ध सी का उपयोग करना सबसे अच्छा है। यदि यह मूल कोड को बदलने के लिए सभी संभव है

void EncodeFromBufferIN(
    unsigned char* bufferIN, 
    int bufferINSize, 
    unsigned char* bufferOUT,     
    int* bufferOUTSize);

तो सी # में कॉल इस प्रकार हो सकता है

[DllImport("QASEncoder.dll")]
public static extern void EncodeFromBufferIN(
    String bufferIN, 
    int bufferINSize, 
    StringBuilder bufferOUT, 
    ref int bufferOUTSize);

String inStr = new String(255);
int inSize = 255;
// make an educated estimate for the output size 
// and preallocate in C# (I am guessing 255)
StringBuilder outStr = new StringBuilder(255);
int outSize = 255;

EncodeFromBufferIN(inStr, inSize, outStr, outSize);

इस तरह से आप अप्रबंधित कोड में स्मृति आवंटन से बच सकते हैं जो कि (हालांकि संभव) गन्दा हो सकता है।

आशा है कि यह आपको जाता है





com