, her ihtimale karşı nasıl olsa onu göndeririz ...
kendi kitaplığınızı erişmek için bir sarıcı yazma sürecini standart .Net kitaplıklarından birine erişmekle aynıdır. CsharpProject adlı bir projede
Örnek C# sınıfı kodu:
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);
}
}
}
Yönetilen C++ sınıf kütüphanesi projesi oluşturmak (örnek CsharpWrapper olan) ve buna bir referans olarak C# projesi eklersiniz. Aynı başlık dosyasını dahili kullanım ve referans projede kullanmak için doğru declspec'i kullanmanın bir yoluna ihtiyacınız var. Bu, bir önişlemci yönergesini (bu durumda CSHARPWRAPPER_EXPORTS
) tanımlayarak ve bir makro dosyasına C/C++ arabiriminizdeki dışa aktarma makrosunu ayarlamak için #ifdef
kullanarak yapılabilir. Yönetilmeyen arabirim üstbilgi dosyası, yönetilmeyen öğeler içermeli (veya önişlemci tarafından filtrelenmiş olmalıdır).
Yönetilmeyen C++ Arabirim Üstbilgi dosyası (CppInterface.h): yönetilen kitaplık dosyalarınıza eklenebilecek bir iç başlık dosyası oluşturabilirsiniz. Bu, using namespace
ifadelerini ekleyecektir ve ihtiyacınız olan yardımcı işlevleri içerebilir.
yönetilen C++ Arayüz Başlık dosyası (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;
}
Sonra sadece sarma yapar Arayüz kodu yazmak.
yönetilen C++ Arayüz Kaynak dosyası (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());
}
Sonra sadece yönetilmeyen projede yönetilmeyen başlığını bağlarken oluşturulan .lib dosyasını kullanmak için bu linker söyleyecektir ve emin olun içerir .Net ve sarmalayıcı DLL'leri, yönetilmeyen uygulamanızla aynı klasörde.
#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());
}
Yönetilmeyen C/C++ ile karşılaşmak istediğiniz arabirim ne kadar karmaşık? – CuppM
Benzer bir soru/cevap için bu bağlantıya bakın: http://stackoverflow.com/questions/13293888/how-to-call-ac-sharp-library-from-native-c-using-c-cli-and-ijw . – amalgamate