Während Lain mich schlagen ein Beispiel zu schreiben, ich es ohnehin nur für den Fall schreiben werde ...
Der Prozess einen Wrapper schreiben Sie Ihre eigene Bibliothek zugreifen entspricht dem Zugriff auf eine der Standardbibliotheken von .Net.
Beispiel C# Klasse Code in einem Projekt namens 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);
}
}
}
Sie würden eine verwaltete C++ Klassenbibliothek Projekt erstellen (Beispiel CsharpWrapper) und C# Projekt als es Verweis hinzuzufügen. Um dieselbe Header-Datei für die interne Verwendung und im referenzierenden Projekt zu verwenden, müssen Sie die richtige Deklaration verwenden. Dies kann durch Definieren einer Präprozessordirektive (CSHARPWRAPPER_EXPORTS
in diesem Fall) und Verwenden einer #ifdef
, um das Exportmakro in Ihrer C/C++ - Schnittstelle in einer Headerdatei zu setzen. Die nicht verwaltete Schnittstellen-Header-Datei muss nicht verwaltetes Material enthalten (oder vom Präprozessor herausgefiltert werden).
Nicht verwaltete C++ Interface Header Datei (CppInterface.h):
Dann können Sie eine interne Header-Datei erstellen, um in Ihre verwalteten Bibliotheksdateien aufnehmen zu können. Dies fügt die using namespace
Anweisungen hinzu und kann Hilfsfunktionen enthalten, die Sie benötigen.
Managed C++ Schnittstelle Header-Datei (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;
}
Dann schreiben Sie einfach Ihre Interface-Code, der die Verpackung der Fall ist.
Managed C++ Schnittstelle Quelldatei (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());
}
Dann sind nur die nicht verwaltete Header in Ihrem nicht verwalteten Projekt, den Linker sagen die generierte LIB-Datei zu verwenden, wenn die Verknüpfung, und stellen Sie sicher, dass die .NET- und Wrapper-DLLs befinden sich im selben Ordner wie Ihre nicht verwaltete Anwendung.
#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());
}
Wie kompliziert ist die Schnittstelle, die Sie unmanaged C/C++ aussetzen möchten? – CuppM
Siehe diesen Link für eine ähnliche Frage/Antwort: http://stackoverflow.com/questions/13293888/how-to-call-ac-sharp-library-from-native-c-using-c-cli-and-ijw . – amalgamate