Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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++ 如何使用.NET中托管DLL中的非托管类?_C++_Dll_Unmanaged_Dllimport - Fatal编程技术网

C++ 如何使用.NET中托管DLL中的非托管类?

C++ 如何使用.NET中托管DLL中的非托管类?,c++,dll,unmanaged,dllimport,C++,Dll,Unmanaged,Dllimport,我有一个非托管类,我正试图从托管DLL文件中导入该类。我正在尝试在另一个托管DLL文件中使用非托管类。然而,当我尝试这样做时,我会得到链接错误 我已经用非托管DLL文件做过很多次了,所以我知道它是如何工作的。我知道如何在托管类中使用“public ref”等 有什么地方我需要挂国旗吗?还是我必须做一些德林波特魔法 这是在.NET 2.0和。您需要为非托管库或COM组件使用互操作程序集。以下是关于这方面的详细信息。您需要为非托管库或COM组件使用互操作程序集。以下是关于这方面的详细信息。如果是CO

我有一个非托管类,我正试图从托管DLL文件中导入该类。我正在尝试在另一个托管DLL文件中使用非托管类。然而,当我尝试这样做时,我会得到链接错误

我已经用非托管DLL文件做过很多次了,所以我知道它是如何工作的。我知道如何在托管类中使用“public ref”等

有什么地方我需要挂国旗吗?还是我必须做一些德林波特魔法


这是在.NET 2.0和。

您需要为非托管库或COM组件使用互操作程序集。以下是关于这方面的详细信息。

您需要为非托管库或COM组件使用互操作程序集。以下是关于这方面的详细信息。

如果是COM DLL文件,则可以使用COM.NET互操作性。堆栈溢出问题是回答这个问题的另一个问题。

如果它是COM DLL文件,则可以使用COM.NET互操作性。堆栈溢出问题是回答这个问题的另一个问题。

如果要使用托管代码中的非托管类,可以:

  • 使用一些恶意代码加载类成员函数(构造函数、析构函数等),并创建一个nastier托管包装类来调用“真实”成员函数。当涉及到虚拟方法时,情况会变得更糟
  • 第二种选择(我认为更好)是编写一个包装类(您提到过,您对此很熟悉),它是非托管类的简单代理。对于非托管类中的每个成员函数,代理类中都会有一个类似的函数。然后,简单地从托管项目中添加对该DLL的引用,您就可以像使用任何其他.NET类一样使用您的类。考虑到如果您的类公开了其他非托管内容(那些无法封送的内容),您将遇到更多的工作

  • 如果您需要关于第二个选项的更多信息,我可以查找一些更详细地解释此技术的旧链接

    如果要使用托管代码中的非托管类,可以:

  • 使用一些恶意代码加载类成员函数(构造函数、析构函数等),并创建一个nastier托管包装类来调用“真实”成员函数。当涉及到虚拟方法时,情况会变得更糟
  • 第二种选择(我认为更好)是编写一个包装类(您提到过,您对此很熟悉),它是非托管类的简单代理。对于非托管类中的每个成员函数,代理类中都会有一个类似的函数。然后,简单地从托管项目中添加对该DLL的引用,您就可以像使用任何其他.NET类一样使用您的类。考虑到如果您的类公开了其他非托管内容(那些无法封送的内容),您将遇到更多的工作

  • 如果您需要关于第二个选项的更多信息,我可以查找一些更详细地解释此技术的旧链接

    所以看起来我必须使用那个链接中的PInvoke。多痛苦啊。我不能像普通的非托管DLL那样只使用dllimport,所以看起来我必须从那个链接使用PInvoke。多痛苦啊。我不能像使用普通的非托管DLL那样只使用dllimport。谢谢您的反馈。我试图避免编写包装器,因为我想快速地以小块的形式读取大量数据,如果我不受管理,我知道内存开销是多少。但我也不想使用PInvoke!:(如果是这样的话,那么你可能需要考虑一种不同的设计。可能是某种缓冲。或者可能将一些逻辑从托管代码移到非托管,以减少对非托管代码的调用。谢谢反馈。我试图避免编写包装器,因为我希望在很小的块中非常快地读取大量数据。保持不受管理我知道内存开销是多少。但也不想使用PInvoke!:(如果是这样的话,那么您可能需要考虑不同的设计。可能是某种缓冲。或者,可能将一些逻辑从托管代码移到非托管,以减少调用非托管代码。@ Nick -管理DLL可以用作COM组件,如果在VisualStudio中启用了用COM登记的选项。@ Nick -管理DLL可以是如果在Visual Studio中启用了向COM注册的选项,则用作COM组件。