सबसे पहले, मैं आपके मूल कार्य के प्रोटोटाइप को समायोजित करूंगा।
चूंकि इस फ़ंक्शन में सी इंटरफ़ेस है, तो आपको बूलियन के लिए सी प्रकार का उपयोग करना चाहिए, सी ++ प्रकार जैसे bool
। आप Win32 के BOOL
प्रकार का उपयोग करना चाह सकते हैं।
इसके अलावा, के रूप में यह वर्तमान में है, अपने समारोह बफर लगने होने का खतरा है: यह गंतव्य result
स्ट्रिंग बफर का अधिकतम आकार निर्दिष्ट करने के लिए दूसरा पैरामीटर जोड़ें बेहतर है।
भी ध्यान रखें कि एक व्यापक शुद्ध सी इंटरफ़ेस कार्यों निर्यात DLLs के लिए सम्मेलन (Win32 एपीआई कार्यों के बहुत सारे की तरह) बुला __stdcall
(नहीं __cdecl
) है। मैं इसका भी उपयोग करूंगा।
अंतिम, चूंकि पहले दो पैरामीटर इनपुट स्ट्रिंग्स हैं, तो आप इसे स्पष्ट और लागू करने के लिए const
का उपयोग करना चाह सकते हैं।
extern "C" __declspec(dllexport)
BOOL __stdcall NativeFunction(
const char *in1,
const char *in2,
char *result,
int resultMaxSize);
फिर, सी # तरफ, आप उपयोग कर सकते हैं निम्नलिखित पी/आह्वान:
तो, मैं इस तरह का निर्यात देशी समारोह के प्रोटोटाइप बनाने चाहते हैं
[DllImport(
"NativeDll.dll",
CharSet = CharSet.Ansi,
CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool NativeFunction(
string in1,
string in2,
StringBuilder result,
int resultMaxSize);
ध्यान दें कि आउटपुट स्ट्रिंग के लिए, StringBuilder
का उपयोग किया जाता है।
भी ध्यान रखें कि CharSet = CharSet.Ansi
एएनएसआई (तथ्य यह है कि रूपांतरण हानिपूर्ण है पर ध्यान देने की सी # के यूनिकोड UTF-16 तार मार्शल करने के लिए प्रयोग किया जाता है - आप एक गैर हानिपूर्ण रूपांतरण, बस सी पर wchar_t*
तार का उपयोग करना चाहते हैं ++ साथ ही साथ)।
// NativeDll.cpp
#include <string.h>
#include <windows.h>
extern "C" __declspec(dllexport)
BOOL __stdcall NativeFunction(
const char *in1,
const char *in2,
char *result,
int resultMaxSize)
{
// Parameter check
if (in1 == nullptr
|| in2 == nullptr
|| result == nullptr
|| resultMaxSize <= 0)
return FALSE;
// result = in1 + in2
strcpy_s(result, resultMaxSize, in1);
strcat_s(result, resultMaxSize, in2);
// All right
return TRUE;
}
और यह निम्नलिखित सी # कंसोल अनुप्रयोग कोड द्वारा सफलतापूर्वक कहा जाता है::
using System;
using System.Runtime.InteropServices;
using System.Text;
namespace CSharpClient
{
class Program
{
[DllImport(
"NativeDll.dll",
CharSet = CharSet.Ansi,
CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool NativeFunction(
string in1,
string in2,
StringBuilder result,
int resultMaxSize);
static void Main(string[] args)
{
var result = new StringBuilder(200);
if (! NativeFunction("Hello", " world!", result, result.Capacity))
{
Console.WriteLine("Error.");
return;
}
Console.WriteLine(result.ToString());
}
}
}
क्या आयात यू की कोशिश की है
मैं एक साधारण सी के साथ एक परीक्षण देशी DLL किया ++? –
मैंने कुछ ऐसा करने की कोशिश की: [DllImport ("MyDll", EntryPoint = "NativeMethod")] सार्वजनिक स्थैतिक बाहरी बूलियन मूलभूत विधि (स्ट्रिंग param1, स्ट्रिंग param2, स्ट्रिंग param3); इसके अलावा param3 या स्ट्रिंगबिल्डर या मार्शलएएस (UnmanagedType.LPStr) के साथ] – bit
आपको एहसास है कि यह आउटपुट पैरामीटर काम नहीं करेगा, है ना? सी # तार ** अपरिवर्तनीय ** हैं। – antonijn