Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
呼叫C++;使用dllImport在C#net中创建Dll_C#_C++_Pinvoke_Call_Dllimport - Fatal编程技术网

呼叫C++;使用dllImport在C#net中创建Dll

呼叫C++;使用dllImport在C#net中创建Dll,c#,c++,pinvoke,call,dllimport,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); [DllI

请查找以下示例

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);
此方法将用于启动实时捕获

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);
<>我不能访问实际的类dSuLLI:::抓取器,如第二语句C++函数中提到的。< /P> 您知道如何声明和获取库类名吗


这个DLL不是一个COM/.NET DLL,作为C++环境的引用。

< P>如果我正确地理解了你的问题,如果它驻留在DLL中(并且由C++头文件访问),你将不能直接访问C中的DSJuLIb:::Gab盗获类。 有两种解决方案。首先,可以在C++/CLI类中封装本机DLL类,这样您就可以包括本地C++头文件;其次,您可以编写自己的DLL,在其中可以展平DLL类并P/调用展平方法

我所说的扁平化是指:

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;
}

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

< P>有很多尝试使C/C++ +互操作更容易,但是到目前为止,来自微软的管理C++可能是最好的(虽然它不是C++标准的一部分)。 另一个有希望的选择是Mono的CXXI

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


它还需要一些黑客攻击(谷歌代码2012的夏天),但它最终应该支持Visual C++和Windows。你可以通过PInvoke直接从C++的C代码中实例化和访问C++类对象,但是它非常复杂,涉及大量的工作,请阅读并阅读C++ PlkIk互操作SDK所能做的。


(这是一个商业软件,我是作者)

我想这就是你想要的:这不会有好的结局。您可以使用DirectShow.NET包装器修补DirectShow。在谷歌查询中输入,点击第二次。非常感谢您提供的信息。我会给你一个尝试和更新进一步。