Próbuję uzyskać dostęp do mikroskopu z poziomu mojej aplikacji C#. SDK jest napisany w C++ i nie mogę dodać biblioteki DLL jako referencji w mojej aplikacji (z powodu niezarządzanego kodu). W rezultacie dowiedziałem się, że będę musiał użyć DllImport, aby móc używać funkcji z C#.Jak wywołać funkcję DLL C++ z C#
Niestety, wydaje mi się, że to nad moją głową.
Jako przykład niektóre kodu C++ (z app próbki zawarte w SDK):
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);
I to jest jak jest ona wykorzystywana później:
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);
Jak to zrobić przekonwertować to do kodu C#? Próbowałem już coś takiego:
[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")]
Ale w zasadzie nie mam pojęcia, co robię i co trzeba zrobić następny (jak jak funkcja musi być określone, w jaki sposób radzić sobie z tym „interfejs” w kodzie C++, czy struktura jest poprawnie skonwertowana itd.).
Dlaczego spadamy? To nie jest najlepsze pytanie, które tu widziałem, ale nie sądzę, że zasługuje na przyłożenie, to, o co tu poproszono, jest całkiem jasne ... – ppetrov
Zamiast tego możesz stworzyć [managed] (http: //www.c-sharpcorner. com/UploadFile/SamTomato/managed-cpp-wrapper-for-unmanaged-code /) VC++ [wrapper] (http://msdn.microsoft.com/en-us/library/c0sfktfw%28v=vs.110%29. aspx) lub rozważ użycie refleksji (choć nie jest to zalecane ...) Zapoznaj się z [Zalecenia dotyczące zarządzanej i niezarządzanego współdziałania kodu] (http://msdn.microsoft.com/en-us/library/ms993883.aspx). –
Możesz również zajrzeć do tego postu: http://stackoverflow.com/questions/2637571/creating-simple-c-net-wrapper-step-by-step Istnieje kilka linków, które mogą być przydatne – ppetrov