-1

请找到以下示例

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。

4

3 回答 3

2

如果我正确理解您的问题,如果 DShowLib::Grabber 类驻留在 DLL 中(并由 C++ 头文件访问),您将无法直接在 C# 中访问它。

有两种解决方案。首先,可以将原生的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;
}

但是,请考虑对您的问题的评论。如果您可以为您感兴趣的库使用现成的包装器,您应该这样做:)

于 2012-04-06T06:27:53.153 回答
0

有很多尝试使 C#/C++ 互操作更容易,但到目前为止,来自 Microsoft 的托管 C++ 可能是最好的(尽管它不是 C++ 标准的一部分)。

另一个有希望的选择是 Mono 的 CXI,

http://tirania.org/blog/archive/2011/Dec-19.html

它提供了一种符合标准的方法。

它仍然需要一些黑客攻击(可能是 Google Summer of Code 2012),但它最终应该支持 Visual C++ 和 Windows。

于 2012-04-06T08:52:52.980 回答
0

是的。您可以通过 PInvoke 直接从您自己的 C# 代码中实例化和访问 C++ 类对象,但它非常复杂并且涉及大量工作,请到这里阅读 C++ PInvoke Interop SDK 可以做什么。

http://www.xinterop.com/index.php/2013/04/13/introduction-to-c-pinvoke-interop-sdk/

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

于 2013-04-13T05:19:42.073 回答