C# uygulamamın içinden bir Mikroskop erişmeye çalışıyorum. SDK, C++ ile yazılmıştır ve Dlls'i başvurumda referans olarak ekleyemiyorum (yönetilmeyen kodlar nedeniyle). Sonuç olarak, C# ile işlevleri kullanmak için DllImport kullanmam gerekeceğini öğrendim.C++ C++ DLL işlevi nasıl yapılır C#
Maalesef bu, kafamın üzerinde bir yol gibi görünüyor.
Örnek olarak C++ kodunun bazı (örnek uygulamasından SDK dahil):
interface Camera;
typedef Camera * CameraHandle;
struct CameraInfo
{
wchar_t camera_name[64]; // camera head type
wchar_t controller_name[64]; // controller type
wchar_t firmware_version[64]; // firmware version
long lib_id; // library ID
long controller_id; // controller ID
long camera_id; // camera ID
CameraHandle handle; // handle to opened camera
long status; // status (0 = available)
CameraInfo()
{
memset(this,0,sizeof(*this));
}
};
typedef struct CameraInfo CameraInfo;
CamDiscoverCameras(OUT const struct CameraInfo ** info, OUT long * count);
Ve bu daha sonra nasıl kullanıldığını geçerli:
CamResult result; //enum CamResult{...}
const CameraInfo* camera_info = NULL;
long camera_count = 0, pre_lib_id, pre_controller_id;
result = CamDiscoverCameras(&camera_info, &camera_count);
Nasıl Yaparım bunu C# koduna dönüştürmek?
[StructLayout(LayoutKind.Sequential)]
struct CameraInfo
{
string camera_name; // camera head type
string controller_name; // controller type
string firmware_version; // firmware version
int lib_id; // library ID
int controller_id; // controller ID
int camera_id; // camera ID
public IntPtr handle; // handle to opened camera
int status; // status (0 = available)
}
[DllImport("Cam.dll", EntryPoint = "CamDiscoverCameras")]
Ama temelde ben, bu nasıl "arayüz" ile başa çıkmak için fonksiyon tanımlanması gerekir nasıl gibi (sonraki yapılması gerekenleri yapıyorum ve ne hiçbir fikrim yok: Zaten böyle bir şey denedi C++ kodunda, doğru şekilde dönüştürülen yapıdır).
Neden düşüş var? Burada gördüğüm en iyi soru değil ama bir indirimi hak ettiğini düşünmüyorum, burada sorulan soru oldukça açık ... – ppetrov
Bunun yerine bir [yönetilen] (http: //www.c-sharpcorner) oluşturabilirsiniz. com/UploadFile/SamTomato/yönetilen-cpp-sarmalayıcı-için-yönetilmeyen-kod /) VC++ [sarmalayıcı] (http://msdn.microsoft.com/en-us/library/c0sfktfw%28v=vs.110%29. aspx) veya yansımayı kullanmayı düşünün (bu önerilmez ...) [http://msdn.microsoft.com/en-us/library/ms993883.aspx] [Yönetilen ve Yönetilmeyen Kod Birlikte Çalışabilirlik Önerileri] 'ne bir göz atın.). –
Ayrıca, bu gönderiye bir göz atabilirsiniz: http://stackoverflow.com/questions/2637571/creating-simple-c-net-wrapper-step-by-step – ppetrov