之前做过一个小demo,里面需要在Wpf下调用SDK(lib)的任务,有些地方仍是不太懂,甚至是错误的,简单总结下,慢慢消化。
1.c#是不能直接调用lib文件的,所以要把lib文件封装成dll文件。
2.封装是要看一看原有的lib函数接口是否支持Unicode,简单来说,如果字符串参数用Char*表示不支持,如果用Tchar表示支持(具体还要看 _UNICODE是否定义 )。
3. 如果不支持Unicode,需要在封装时,将参数进行转化。c#string对应c++wchar,而wchar到char是需要转化的。(Unicode到anscii)。C#dllinport声明中,函数参数应为([MarshalAs(UnmanagedType.LPWStr)]string)
4.c#中的delegate对应c++的回调函数。在调用时,需要看一下lib的编译方式, 如果啥都没写,表示默认使用_cdecl调用。而c#中是默认_pascal调用,所以在delegate声明时,特别声明下 [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
5. wpf中的控件是没有句柄中, PresentationSource.FromVisual(YourImageControl) as HwndSource; 最终获得的都是窗体句柄。
1.c#是不能直接调用lib文件的,所以要把lib文件封装成dll文件。
2.封装是要看一看原有的lib函数接口是否支持Unicode,简单来说,如果字符串参数用Char*表示不支持,如果用Tchar表示支持(具体还要看 _UNICODE是否定义 )。
3. 如果不支持Unicode,需要在封装时,将参数进行转化。c#string对应c++wchar,而wchar到char是需要转化的。(Unicode到anscii)。C#dllinport声明中,函数参数应为([MarshalAs(UnmanagedType.LPWStr)]string)
4.c#中的delegate对应c++的回调函数。在调用时,需要看一下lib的编译方式, 如果啥都没写,表示默认使用_cdecl调用。而c#中是默认_pascal调用,所以在delegate声明时,特别声明下 [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
5. wpf中的控件是没有句柄中, PresentationSource.FromVisual(YourImageControl) as HwndSource; 最终获得的都是窗体句柄。
6.wpf中可以利用WindowsFormsHost来使用Winform控件(winform控件是都有句柄的),但要注意窗体AllowsTranspancy不能设置成true,否则winform无法正常显示(暂时未解决)
7.在vs中对lib封装成dll时,代码生成的运行库要选用MTd方式,否则最后生成的程序在别的电脑上可能因为依赖,无法运行。