如何最好地避免 C++/CLI 本机类型中的双重转换

2024-03-21

传统上,我一直使用 MFC 扩展 dll 并使用 dllimport/dllexport 导入/导出。

但是,当 dll 更改为使用 /clr 时,此方法的成本会变得很高,因为调用可能会导致双重转换。我现在的性能受到了巨大的打击,需要停止双重重击。我见过的解决方案描述建议确保所有内容都使用 __clrcall 约定,但这不适用于 dllexport。

微软自己关于双重思考的部分建议:

同样,如果导出(dllexport、dllimport)托管函数,则会生成本机入口点,并且导入和调用该函数的任何函数都将通过本机入口点进行调用。为了避免在这种情况下出现双重转换,请不要使用本机导出/导入语义;只需通过 #using 引用元数据(请参阅#using 指令 ​​(C++))。

对我来说,这看起来好像我可以从我的类中删除 dllexport/dllimport 并在我的 stdafx.h 中添加 #using 。但是,对于本机类型,这会导致 LNK2028(无法解析的令牌)和 LNK2019(无法解析的外部符号)。无论我是否在链接器中包含 .lib 都没有什么区别;我仍然收到此错误。

所以,我的问题是如何最好地避免双重转换并从 C++/CLI 库导入本机类型?

Regards

Nick

** 更新 **

测试的一些更新。

  1. 一旦使用 /clr 编译 dll,本机类型就会发生双重转换(使用 dllexport/dllimport)。

  2. 通过逐个文件关闭 CLR 支持可以缓解这种情况。这很痛苦,有时本机类型使用 clr,因此不能在任何地方都这样做。并且被调用者也必须被编译为本机才能工作。

  3. 方法可以标记为 __clrcall,但这在与 dllexport 混合时会导致编译错误。然而,我已经成功地使以下代码无需双重重击即可工作:

    // MFCCLRLIB_API is defined in the library only (as dllexport) 
    // but NOT defined when using (dllimport)
    // MFCCLRLIB_CALL is defined as empty in the library, 
    // but __clrcall when using.
    
    #ifndef _MFCCLRLIB
    #define MFCCLRLIB_API
    #define MFCCLRLIB_CALL __clrcall
    #endif
    
    class MFCCLRLIB_API ThunkHack
    {
    public:
        ThunkHack();
    
        ThunkHack(const ThunkHack&);
    
        ~ThunkHack();
    };
    
    class MFCCLRLIB_API ThunkHackCaller
    {
    public:
        ThunkHackCaller(void);
        ~ThunkHackCaller(void);
    
        virtual void MFCCLRLIB_CALL UseThunkClass(ThunkHack thunk);
    };
    

编译完成后,我现在可以从库外部使用调用者类,并且不会导致双重重击。这就是我想要的。然而,我担心这不是正确的方法。我还没有读到任何表明这种方法是安全的。

我真的很想要一些关于如何有效使用混合模式 C++ 库以避免我们所看到的性能影响的指南。

-Nick


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何最好地避免 C++/CLI 本机类型中的双重转换 的相关文章

  • SetWindowPos() 函数不移动窗口?

    我有一个对话框 我想将其放置在另一个对话框中 并相对于主对话框上的其中一个控件进行定位 void CspAceDlg DrawResultsArea CWnd pTabCtl GetDlgItem IDC BUILDTABS CRect r
  • 嵌入式非托管 DLL 无法在 ASP.NET 中加载

    我正在为 WCF 服务开发 ASP NET 主机 该服务引用 C CLI 包装器库 该库本身引用非托管 DLL 基于这个问题 https stackoverflow com questions 2907169 asp net load un
  • 如何显示非模式对话框并立即在其中显示信息?

    我想在屏幕上显示一个无模式对话框并在其中显示一些信息 但是 如果我按照以下方式使用它 则会出现一些问题 function showdialog XXX heavy work update the dialog heavy work upda
  • 如何最好地避免 C++/CLI 本机类型中的双重转换

    传统上 我一直使用 MFC 扩展 dll 并使用 dllimport dllexport 导入 导出 但是 当 dll 更改为使用 clr 时 此方法的成本会变得很高 因为调用可能会导致双重转换 我现在的性能受到了巨大的打击 需要停止双重重
  • 用于本机 C++ 的 C++/CLI 包装器,可在 C# 中用作参考

    标题解释了 我有本机 C dll 正在为其编写 C CLI 包装器 这些包装器将依次导入到 C 中作为参考 问题是在 C 中我看不到包装器中的类 从 DLL 导入 我应该使用哪些关键字以及如何重新声明我的本机 C 对象以在 C 中可见 好的
  • 当目标位于另一个 AppDomain 中时,非托管到托管的回调要慢得多

    我使用委托从非托管代码调用托管代码 当我调用默认 AppDomain 中的托管代码时 我测量到每次调用的平均时间为 5 4 纳秒 当我调用第二个 AppDomain 时 我测量到每次调用需要 194 纳秒 默认VS2017 x86发布配置
  • 将 CLR 类型转换为 void* 并返回

    例如 如何正确转换 CLR 类型Foo to void 过一段时间再回来 场景是 我在 DLL 中有一些非托管代码 可以总结为 class Handler void obj void call void obj int detail voi
  • 如何调试 Windows 窗体设计器崩溃?

    我有一个 Windows 窗体项目 它的主要形式源自System Windows Forms Form我可以毫无问题地在设计器中打开它 如果我尝试关闭设计器 它会杀死 Visual Studio v2008 SP1 该表单包括一个选项卡控件
  • 默认情况下启用或禁用菜单项。为什么?

    我有一些遗留代码 由于某种原因 菜单项在启动时被启用或禁用 我的问题是 如何 有没有办法在不调用 EnableMenuItem 函数的情况下执行此操作 MFC 有没有办法做与资源设置所说相反的事情 我也不明白为什么当最后一个子窗口关闭时 当
  • 是否有 C++/CLI 智能指针项目(例如scoped_ptr)?

    是否有 C CLI RAII 智能指针类用于在托管类型中包含本机指针 只是想知道 在我自己写之前clr scoped ptr值类模板 我知道微软提供的 本机类中托管句柄的包含 auto gcroot http msdn microsoft
  • 如何向 CMFCPopupMenu 添加图标?

    我想用CMFCPopupMenu用于右键单击期间的弹出菜单 如何添加图标CMFCPopupMenu 这是我在基本 MFC 应用程序中尝试的示例代码 CMFCPopupMenu TestCMFCPopMenu new CMFCPopupMen
  • 基于 C# .NET 文档的应用程序操作图

    我想开发一个新的应用程序 用户可以在其中创建描述流程的图表 我认为在这种情况下 基于文档的应用程序是我唯一的选择 我熟悉C net C MFC 和J2EE 根据您的经验 实现这一目标的最佳方法是什么 我应该关注哪个平台 图表必须由方框和箭头
  • 如何停止对辅助隐式加载 DLL 的 DLL 劫持

    例如 COMDLG32 DLL 隐式链接到以下系统 DLL 以及其他 xmllite dll dll srvcli dll wkscli dll 链接信息库 netutils dll 微星 dll 由于这些是由操作系统隐式加载的 而不是使用
  • 如何通过单击 MainFrame 内的按钮来更改 MFC 视图

    我想通过单击窗口内的按钮来更改呈现的视图像这样 https i stack imgur com 3IA2o png 我的项目设置 我制作了一个没有文档 视图支持的 MFC 项目 SDI 我在设计器中又创建了两个视图并向它们添加了类 新的视图
  • 如何在VC++/MFC中替换字符串中两个子字符串之间的字符串?

    假设我有一个 CString 对象 strMain AAAABBCCCCCCDDBBCCCCCCCCDDDAA 我还有两个较小的字符串 例如 strSmall1 BB strSmall2 DD 现在 我想替换 strMain 中 strSm
  • MFC CMenu 工具提示未显示

    我尝试使用类似的东西来设置 CMenu 项的工具提示 如所述here https stackoverflow com questions 2400180 mfc how to add tooltip in cmenu items 但它只是显
  • _CrtDumpMemoryLeaks( ) == 1 在第一行代码上?

    我正在开发一个 MFC Visual C 项目 据我了解MSDN http msdn microsoft com en us library d41t22sb 28v VS 100 29 aspx CrtDumpMemoryLeaks 应该
  • C++ 虚(密封)函数

    我在我的 C 项目中使用 dll 中的类 一切都工作正常 直到 当尝试调用某个方法 在对象浏览器中列出 时 我收到一条错误消息 指出该方法不是命名空间的成员 经过调查 我注意到该方法被列为 virtual void x seal 有没有办法
  • 如何使用 MFC 禁用顶级菜单项并使其变灰

    我有一个对话框应用程序 我希望在对话框顶部有可单击的菜单项 这些项目不显示下拉菜单 但实际上运行关联的命令 我通过在对话框属性中设置 Popup False 并分配消息 ID 来做到这一点 但我的问题是 当项目可点击没有意义时 无法正确禁用
  • 对 MFC UI 应用程序进行单元测试吗?

    如何对大型 MFC UI 应用程序进行单元测试 我们有一些大型 MFC 应用程序已经开发了很多年 我们使用一些标准的自动化 QA 工具来运行基本脚本来检查基础知识 文件打开等 这些由 QA 小组在日常构建后运行 但我们希望引入一些程序 以便

随机推荐