调用C++的Dll使用的DllImport

问题描述:

请找到下面的例子C#.NET调用C++的Dll使用的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不是COM/NET的DLL到包括以C#环境的引用。

+0

我认为这是你在找什么:HTTP://计算器。com/questions/4741035/how-do-i-dllexport -c-sharp-application-in-a-c-sharp- – Kiril 2012-04-05 14:04:30

+0

这不会很好的结束。你可以使用DirectShow.NET包装来修补DirectShow。在谷歌查询中键入,获得第二次打击。 – 2012-04-05 14:28:35

如果我正确理解你的问题,你将不能够,如果它驻留在DLL中(并且是由C++头文件访问)直接访问在C#中DShowLib ::抓取类。

两个解决方案可供选择。首先,您可以将本机DLL类封装在C++/CLI类中,以便您可以包含本机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; 
} 

但是,请考虑您的问题提出的意见。如果您可以使用现成的包装器来制作您感兴趣的库,那么您应该这样做:)

+0

非常感谢您的信息。我会试一试并进一步更新。 – user1315385 2012-04-06 11:02:47

有很多尝试使C#/ C++ interop变得更容易,但是从Microsoft管理的C++可能是最好的(尽管它不是C++标准的一部分)。

另一个有希望的选择是从单声道CXXI,

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

它提供了一个符合标准的做法。

它仍然需要一些黑客攻击(2012码,也许谷歌的夏),但它应该终于支持的Visual C++和Windows。

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

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

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