Zuerst würde ich den Prototyp Ihrer nativen Funktion anpassen.
Da diese Funktion über eine C-Schnittstelle verfügt, sollten Sie einen C-Typ für boolesche Werte verwenden, keinen C++ - Typ wie bool
. Möglicherweise möchten Sie den Typ BOOL
von Win32 verwenden.
Außerdem ist, wie es derzeit ist, ist Ihre Funktion anfällig für Puffer Überschreitungen: es ist besser, einen anderen Parameter hinzuzufügen, um die maximale Größe des Ziel result
String-Puffer angeben.
Beachten Sie auch, dass ein weit verbreitetes Aufrufkonvention für DLLs reinen C-Schnittstelle Funktionen Export (wie viele Win32-API-Funktionen) ist __stdcall
(nicht __cdecl
). Ich würde das auch benutzen.
Last, da die ersten beiden Parameter sind Eingang Strings, können Sie wollen const
verwenden, um deutlich zu machen, und const-Korrektheit erzwingen.
So würde ich den Prototyp der exportierten native Funktion wie diese machen:
extern "C" __declspec(dllexport)
BOOL __stdcall NativeFunction(
const char *in1,
const char *in2,
char *result,
int resultMaxSize);
Dann wird auf der C# Seite, können Sie die folgenden P/Invoke verwenden:
[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);
Beachten Sie, dass für die Ausgabezeichenfolge StringBuilder
verwendet wird.
Beachten Sie auch, dass CharSet = CharSet.Ansi
verwendet C# 's Unicode UTF-16-Strings in das ANSI (achten Sie auf die Tatsache, Marschall, dass die Umwandlung verlustbehaftete ist - wenn Sie eine nicht-verlustbehaftete Umwandlung wollen, nur wchar_t*
Saiten auf der C++ verwenden Seite auch).
habe ich einen Test mit einem einfachen C++ nativen DLL:
// 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;
}
Und es wird erfolgreich durch den folgenden C# Konsole App-Code genannt:
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());
}
}
}
welchen Import u haben versucht? –
Ich habe versucht, etwas wie: [DllImport ("MyDll", EntryPoint = "NativeMethod")] public static extern Boolean NativeMethod (Zeichenfolge param1, Zeichenfolge param2, Zeichenfolge param3); Auch mit outparam3 oder StringBuilder oder MarshalAs (UnmanagedType.LPStr)] – bit
Sie erkennen, dass dieser Ausgangsparameter nicht funktioniert, oder? C# -Strings sind ** unveränderlich **. – antonijn