जबकि LAIN मुझे एक उदाहरण लिखने के लिए हरा, मैं इसे किसी भी तरह सिर्फ मामले में पोस्ट करेंगे ...
अपनी खुद की लाइब्रेरी का उपयोग करने के लिए एक आवरण लिखने की प्रक्रिया मानक नेट पुस्तकालयों में से एक को एक्सेस करने के समान है।
उदाहरण सी एक परियोजना CsharpProject बुलाया में # वर्ग कोड:
using System;
namespace CsharpProject {
public class CsharpClass {
public string Name { get; set; }
public int Value { get; set; }
public string GetDisplayString() {
return string.Format("{0}: {1}", this.Name, this.Value);
}
}
}
आप प्रबंधित सी ++ वर्ग पुस्तकालय परियोजना बनाने (उदाहरण के CsharpWrapper है) और यह करने के लिए एक संदर्भ के रूप में अपनी सी # परियोजना जोड़ना होगा। आंतरिक उपयोग के लिए और संदर्भ प्रोजेक्ट में समान हेडर फ़ाइल का उपयोग करने के लिए, आपको सही declspec का उपयोग करने का एक तरीका चाहिए। यह एक प्रीप्रोसेसर निर्देश (CSHARPWRAPPER_EXPORTS
इस मामले में) को परिभाषित करके और #ifdef
का उपयोग करके हेडर फ़ाइल में अपने सी/सी ++ इंटरफेस में निर्यात मैक्रो सेट करने के लिए किया जा सकता है। अप्रबंधित इंटरफेस हेडर फ़ाइल में अप्रबंधित सामान होना चाहिए (या इसे प्रीप्रोसेसर द्वारा फ़िल्टर किया गया है)।
अप्रबंधित सी ++ इंटरफ़ेस हैडर फ़ाइल (CppInterface।एच):
#pragma once
#include <string>
// Sets the interface function's decoration as export or import
#ifdef CSHARPWRAPPER_EXPORTS
#define EXPORT_SPEC __declspec(dllexport)
#else
#define EXPORT_SPEC __declspec(dllimport)
#endif
// Unmanaged interface functions must use all unmanaged types
EXPORT_SPEC std::string GetDisplayString(const char * pName, int iValue);
फिर आप अपनी प्रबंधित लाइब्रेरी फ़ाइलों में शामिल करने में सक्षम होने के लिए एक आंतरिक शीर्षलेख फ़ाइल बना सकते हैं। यह using namespace
कथन जोड़ देगा और आपको आवश्यक सहायक कार्यों को शामिल कर सकते हैं।
प्रबंधित सी ++ इंटरफ़ेस हैडर फ़ाइल (CsharpInterface.h):
#pragma once
#include <string>
// .Net System Namespaces
using namespace System;
using namespace System::Runtime::InteropServices;
// C# Projects
using namespace CsharpProject;
//////////////////////////////////////////////////
// String Conversion Functions
inline
String^ToManagedString(const char * pString) {
return Marshal::PtrToStringAnsi(IntPtr((char *) pString));
}
inline
const std::string ToStdString(String^strString) {
IntPtr ptrString = IntPtr::Zero;
std::string strStdString;
try {
ptrString = Marshal::StringToHGlobalAnsi(strString);
strStdString = (char *) ptrString.ToPointer();
}
finally {
if (ptrString != IntPtr::Zero) {
Marshal::FreeHGlobal(ptrString);
}
}
return strStdString;
}
तो फिर तुम सिर्फ अपने इंटरफेस कोड कि रैपिंग करता लिखें।
प्रबंधित सी ++ इंटरफ़ेस स्रोत फ़ाइल (फ़ाइलें CppInterface.cpp):
#include "CppInterface.h"
#include "CsharpInterface.h"
std::string GetDisplayString(const char * pName, int iValue) {
CsharpClass^oCsharpObject = gcnew CsharpClass();
oCsharpObject->Name = ToManagedString(pName);
oCsharpObject->Value = iValue;
return ToStdString(oCsharpObject->GetDisplayString());
}
तो बस अपने अप्रबंधित परियोजना में अप्रबंधित हैडर, जब जोड़ने लिंकर उत्पन्न उदारीकरण फ़ाइल का उपयोग करने बताओ, और सुनिश्चित करें कि शामिल नेट और रैपर डीएलएल आपके अप्रबंधित एप्लिकेशन के समान फ़ोल्डर में हैं।
#include <stdlib.h>
// Include the wrapper header
#include "CppInterface.h"
void main() {
// Call the unmanaged wrapper function
std::string strDisplayString = GetDisplayString("Test", 123);
// Do something with it
printf("%s\n", strDisplayString.c_str());
}
अप्रत्याशित सी/सी ++ में इंटरफ़ेस का खुलासा करना कितना जटिल है? – CuppM
इस लिंक को एक समान प्रश्न/उत्तर के लिए देखें: http://stackoverflow.com/questions/13293888/how-to-call-ac-sharp-library-from-native-c-using-c-cli-and-ijw । – amalgamate