我有一个项目,它捕获来自多个C ++的摄像机的图像。我想在我的新项目中使用该项目,这是在C#。我已经制作了该项目的dll。我的问题是,我怎么能用它我的项目中的DLL。我知道通过将窗口句柄传递给C ++ DLL我们可以使用它但我不知道该怎么做以及我应该在dll中做出哪些更改。
请原谅,如果这是愚蠢的问题。
答案 0 :(得分:1)
我确实遇到了问题,这篇文章帮助了我。 http://blogs.msdn.com/b/jonathanswift/archive/2006/10/03/dynamically-calling-an-unmanaged-dll-from-.net-_2800_c_23002900_.aspx
要传递句柄,可以在C ++端添加另一个函数。像,
(在标题中)
extern "C" __declspec(dllexport) void SetParent(HWND hWnd);
在C#中使用SetParent
class Program
{
...
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void SetParent(IntPtr hWnd);
public void testMethod()
{
...
IntPtr getAddress = NativeMethods.GetProcAddress(pDll, "SetParent");
...
SetParent setParent = (SetParent)Marshal.GetDelegateForFunctionPointer(getAddress, typeof(SetParent));
setParent(this.Handle);
...
}
}
答案 1 :(得分:0)
如果您的C ++项目已经在DLL中,您可以使用P/Invoke调用它导出的任何函数。您必须在C#程序集中声明该方法,如下所示,但是您可以像标准静态方法一样调用它。
[DllImport("YourDllsName.dll")]
public static extern bool FunctionThatAWindowHandleAndReturnsBool(IntPtr hWnd);
根据C ++ DLL的函数所使用的参数类型,.Net数据类型的marshaling可能会使C数据类型变得复杂。