Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.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# 呼叫c++;c语言库#_C#_C++_Unmanaged - Fatal编程技术网

C# 呼叫c++;c语言库#

C# 呼叫c++;c语言库#,c#,c++,unmanaged,C#,C++,Unmanaged,这个问题似乎重复了以前的问题。我已经阅读了一系列的帖子,但对我的情况并不完全清楚 我有一个C++库,它是用MMONICS IDE创建的。我必须能够将这个库用于c#项目 在交给我之前,有人一直在做这个项目。目前,有两个层使这成为可能。首先,C++项目包括一个带有C++包装器的完整库。此项目将创建一个dll作为输出。这个C++ DLL然后被馈送到一个C项目,它有对C++ DLL的DLLIMPARE调用。这个c#项目再次创建了一个dll。最后,为了在c#应用程序中使用库,我必须包含对这两个DLL的引用

这个问题似乎重复了以前的问题。我已经阅读了一系列的帖子,但对我的情况并不完全清楚

我有一个C++库,它是用MMONICS IDE创建的。我必须能够将这个库用于c#项目

在交给我之前,有人一直在做这个项目。目前,有两个层使这成为可能。首先,C++项目包括一个带有C++包装器的完整库。此项目将创建一个dll作为输出。这个C++ DLL然后被馈送到一个C项目,它有对C++ DLL的DLLIMPARE调用。这个c#项目再次创建了一个dll。最后,为了在c#应用程序中使用库,我必须包含对这两个DLL的引用

这是让它工作的正确方法吗?我在想也许应该有一种方法来简化这个过程

有人能帮我解答这个问题吗?

你可以使用:


<> >假设你使用C++库,我假设它利用C++类的语义,而不是仅仅暴露程序。如果是这种情况,那么通常这样做的方式是通过手动创建的托管C++互操作库。

基本上,在VisualStudio中创建托管C++库,引用现有的C++库,并在现有C++类周围创建托管包装。然后,在C++项目中引用这个(托管)C++程序集,并将C(c)组件中的原始(非托管)C++库作为一个放置在生成目录中的文件。

这是必需的,因为没有办法通过P/Unjk(dLimPurt/Cuff>)调用引用C++类的东西。 如果您的基本库只是一系列函数,那么您可以通过p/Invoke函数在C#项目中直接引用这些函数


任一种方式,上面提到的所有库(第一个,非托管C++库,托管C++程序集,C类项目,或者第二个,未受约束的C++库和C~*项目)都必须包含在引用它们的任何项目中。您无法将非托管库静态链接到托管程序集。

似乎您的包装器太多了,但可能有人正在实现某种外观或添加属性或其他内容。托管和非托管之间的基本连接将是DllImport“平面”函数调用(而不是成员函数)或C++/CLI代码调用成员函数。如果包装是C++/CLI,那么写起来最简单(只包括C++库的头),最容易调用(C++代码只添加了.NET引用,并正常进行),所以如果项目中有C++专长,这将是我的第一选择。
听起来你接手的人都很难做到。如果方法少于20种,我建议重新开始。

+1,但我想指出,除非您使用.NET 1.1,“托管C++”现在称为“C++/CLI”,两者之间存在巨大差异。此外,我认为您的意思是“您不能动态链接非托管库”。静态链接是使用库的唯一方法。非常感谢。。。。正如您所提到的,非托管库确实有类和接口。既然如此,我相信我必须有一个C++包装器和一个C++包装器才能在我的C应用程序中使用非托管C++库,对吧?现在C++包装器负责创建类的实例并实现接口,这是正确的吗?我还有一个问题。非托管库的任务是提供外部“C”和dllexport功能吗?目前还没有,但我可以把它作为下一个项目的要求,所以我只想确定一下。@Batul:对于你的第一个问题,是的;您需要在C++中使用一个包装类(感谢Randolpho来澄清术语),这会消耗您的经典C++类型。对于第二个问题,是的,如果您想使用
DllImport
路径,那么您的非托管库需要公开
extern“C”
函数,以便在完全托管(C#、VB.NET等)程序集中使用它们。注意这里我们谈论的是两件不同的事情;通常,您可以使用C++/CLI程序集作为包装器,或者在托管代码中导出过程函数和
DllImport
它们。哦,现有的实现使用这两种方法。在我前面工作的那个家伙已经创建了一个C++包装器并导出了函数。然后,他还使用c#中的DllImport访问函数。谢谢你的澄清。现在,考虑到非托管C++ LIB具有类和接口,DLLIMPOLL是一种选择吗?另外,如果我创建了c++/cli包装器,那么这是否意味着我可以简单地将其添加为c#app n中的一个引用并按原样使用它?不必使用DllImport?我真的很抱歉问了这么多问题,但非常感谢您的耐心。重新开始的可能重复对我来说也是最好的解决方案,但一旦我开始,无论我看了什么,都只指出当前的解决方案是正确的方法。我从您的建议中理解到,还有一个C++包装器来处理非托管C++ LIB中的类,然后使用C语言中的DLLIMPART调用。我说的对吗?如果您添加一个C++/CLI包装器,它可以将您从P/Invoke(DllImport)中解救出来。基本上,您的C++/CLI代码只需“包含头,链接到库”即可使用本机代码。C++/CLI代码中的任何
public ref class Foo
都可以从C#调用,根本没有互操作机制-只需添加一个引用并使用它即可。谢谢Kate。从我到目前为止所读到的内容来看,DllImport在非托管库中需要一个平面结构,即没有类和接口。但是我的非托管库有类和接口,这是否意味着我不能使用DllImport?如果是这样的话,那么创建c++/cli包装器是唯一的方法?在c++-land中,几乎没有“onl”
class Example
{
    // Use DllImport to import the Win32 MessageBox function.
    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);

    static void Main()
    {
        // Call the MessageBox function using platform invoke.
        MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
    }
}