我想從我的C#應用程序中訪問顯微鏡。 SDK是用C++編寫的,我不能在應用程序中添加Dll作爲引用(由於它們是非託管代碼)。 因此,我發現我需要使用DllImport才能在C#中使用這些功能。如何從C#中調用C++ DLL函數#
不幸的是,這似乎是我的頭。
作爲示例的一些C++代碼的(從一個示例應用程序包含在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);
這是如何使用它以後:
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);
我如何將其轉換爲C#代碼?我已經嘗試過這樣的:
[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")]
但基本上我沒有的我在做什麼,哪些需要下一個(的功能等需要如何定義做的想法,如何處理與「接口」在C++代碼中,是正確轉換的結構等等)。
爲什麼downvote?這不是我在這裏看到的最好的問題,但我認爲它不值得讚揚,這裏提出的問題很清楚...... – ppetrov 2014-10-09 11:22:52
相反,您可以創建一個[託管](http://www.c-sharpcorner。 com/UploadFile/SamTomato/managed-cpp-wrapper-for-unmanaged-code /)VC++ [wrapper](http://msdn.microsoft.com/zh-cn/library/c0sfktfw%28v=vs.110%29。 aspx),或者考慮使用反射(儘管這不是建議的...)看看[對託管和非託管代碼互操作性的建議](http://msdn.microsoft.com/zh-cn/library/ms993883.aspx )。 – 2014-10-09 11:25:15
你也可以看看這篇文章:http://stackoverflow.com/questions/2637571/creating-simple-c-net-wrapper-step-by-step有一些鏈接,可以是有用的 – ppetrov 2014-10-09 11:26:19