请查看以下示例
void ExitLibrary(); // C++ function
我能够转换为C#,如下所示
[DllImport("VisualFOD.dll", CharSet = CharSet.Ansi)]
public static extern void ExitLibrary();
此方法将用于启动实时捕获
bool StartLive(DShowLib::Grabber* f_Grabber, HDC f_hHdc, RECT f_WindowRect);
此方法将用于启动实时捕获
[DllImport("TIS_UDSHL09_vc71.dll", CharSet = CharSet.Ansi)]
public static extern bool StartLive(IntPtr f_Grabber, IntPtr f_hHdc, Rectangle f_WindowRect);
我无法访问第二个语句C ++函数中提到的实际类DShowLib :: Grabber。
您是否知道如何声明和获取库类名?
此dll不是包含在C#环境中的COM / .Net dll。
答案 0 :(得分:2)
如果我正确理解了您的问题,如果它位于DLL内部(并且由C ++头文件访问),您将无法直接在C#中访问DShowLib :: Grabber类。
有两种解决方案可供选择。首先,您可以将本机DLL类包装在C ++ / CLI类中,以便您可以包含本机C ++头文件;其次,你可以编写自己的DLL,在这里你可以展平DLL类和P / Invoke你的展平方法。
通过扁平化我的意思是:
class C
{
void M(int i, float j);
}
必须调用方法M,如:
__declspec(dllexport) BOOL __stdcall C_M(C * instance, int i, float j)
{
if (instance == nullptr)
return FALSE;
instance->M(i, j);
return TRUE;
}
但是,请考虑您的问题的评论。如果您可以使用您感兴趣的库的现成包装,您应该这样做:)
答案 1 :(得分:0)
有许多尝试使C#/ C ++互操作更容易,但到目前为止,来自Microsoft的托管C ++可能是最好的(尽管它不是C ++标准的一部分)。
另一个有希望的选择是来自Mono的CXXI,
http://tirania.org/blog/archive/2011/Dec-19.html
提供符合标准的方法。
它仍然需要一些黑客攻击(可能是Google Summer of Code 2012),但它应该最终支持Visual C ++和Windows。
答案 2 :(得分:0)
是。您可以通过PInvoke直接从您自己的C#代码实例化和访问C ++类对象,但它非常复杂并涉及大量工作,请到这里阅读C ++ PInvoke Interop SDK可以做的事情。
http://www.xinterop.com/index.php/2013/04/13/introduction-to-c-pinvoke-interop-sdk/
(虽然是商业软件。我是作者)