使用dllImport在C#.net中调用C ++ Dll

时间:2012-04-05 13:49:10

标签: c# c++ pinvoke call dllimport

请查看以下示例

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。

3 个答案:

答案 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/

(虽然是商业软件。我是作者)