非托管和托管c++ DLL之间的互操作性
Interoperability between unmanaged and managed C++ DLL
我目前有一个使用MFC的旧的非托管c++ DLL。这个DLL有一堆代码是多线程的,并在2003年使用VC6编写。遗憾的是,这段代码不再工作了。
我的任务是找到一种运行这个多线程代码的替代方法,以便它按预期工作。在我之前有人已经用c#重写了它,我需要将c#代码移植到vc++上。我做了一些研究,并意识到我可以通过将c#代码移植到vc++(使用。net框架)来节省移植过程中的一些时间。但后来我意识到,我的旧MFC DLL不能运行这个。net代码。
我的想法是在vc++ DLL中编写多线程代码(使用。net框架),并使用某种形式的互操作性,以便能够从旧的DLL调用函数到新的DLL。
我研究了COM的互操作性和包装类。实现这一目标的最佳方式是什么?有什么教程可以帮助我完成这个任务吗?(我已经做了一些广泛的搜索,有很多教程使用非托管c++ dll到c# dll,但没有多少适合我的情况)。
就像你知道的那样,我不能用/clr编译旧的DLL,因为这个DLL也托管在旧的Win32应用程序中。使用/clr编译会导致应用程序崩溃,否则这种情况早就发生了。
澄清:我很好奇,为什么通过COM互操作从非托管c++ DLL调用驻留在c# DLL中的函数,与使用托管c++ DLL做完全相同的事情相比,似乎如此简单。我甚至有一个c#和c++之间的概念验证,但我一辈子都无法开始理解用c++执行完全相同的任务。是否碰巧有一个简单的教程来调用一个简单的(让我们说'Add')函数从非托管c++到托管c++ ?
如果你有一个(托管的)DLL,不管它是用哪种语言编写的,你都需要一个进程来运行它。如果您有一个本机进程——无论出于何种原因——必须不使用CLR,那么您就不能直接从该进程中使用托管DLL(任何依赖于进程内CLR的代码)。
您将需要第二个辅助进程来运行托管的DLL,例如,公开本机进程可以调用的COM接口。(COM服务器退出进程)
我研究了COM的互操作性和包装类。实现这一目标的最佳方式是什么?
不确定包装器类是什么意思,但是为您托管的DLL提供进程外COM服务器可以做到这一点。(很明显,这是相当严重的错误。来管理helper进程的正确注册和启动/关闭。
把这个问题分解一下(据我所知):
[oldish Win32 app (no! CLR)]
<- normal DLL interface -> [native/MFC DLL (no! CLR)]
<- via COM -> [stuff in a separate executable]
如果这是你正在寻找的,那么这篇文章(只是一个快速的谷歌点击)可能会有所帮助:
http://www.codeproject.com/KB/COM/BuildCOMServersInDotNet.aspx一般来说,我认为任何COM教程都应该涵盖你应该尝试做的事情。
- COM 互操作性需要强命名程序集吗?
- CComPtr 和 std::shared_ptr 互操作性
- C和C++原子之间的互操作性
- C/C++ 与 C# 的互操作性命名约定
- C和C++中类型的互操作性
- C++与Fortran的互操作性
- 关于C#与非托管C++的互操作性的持续传奇
- java和c++的互操作性
- 如何从C++和通过COM互操作性访问.NET类的属性
- OpenCL/OpenGL 互操作性纹理段错误
- Swift和Objective-C++互操作性
- Windows XP和Windows 7之间的DCOM互操作性
- 寻找C++到 WPF/Cocoa 互操作性的跨平台、端到端示例
- QML 和 C++ 映像互操作性
- GNU Fortran与C的互操作性
- linux时区互操作性
- VS 2012与VS 2010的互操作性
- 非托管和托管c++ DLL之间的互操作性
- 使用Crypto实现c++和c#之间加密的互操作性
- c++和Scala之间有多少互操作性