繁体   English   中英

是否可以在针对 net6.0-windows 的 C++/CLI 项目中使用 CWinFormsControl/AfxWinForms.h 以及如何使用?

[英]Is it possible to use CWinFormsControl/AfxWinForms.h in a C++/CLI project targeting net6.0-windows and how?

我们有一个相当大的解决方案,其中包含使用 MFC 和 Winforms 控件构建 UI 的 C++/CLI 和 C# 项目的混合。 应用程序中的几个 MFC 对话框使用 afxwinforms.h 中的 CWinFormsControl 将 WinForms 控件嵌入其中,目前一切都针对 .NET48 并且工作正常。 我们正在尝试将所有内容更新到 .NET6.0,除了包含 afxwinforms.h 的一个项目之外,一切似乎都正常。

项目设置如下:
公共语言运行时支持: .NET Core 运行时支持(/clr:netcore)
.NET Core 目标框架: net6.0-windows(我只尝试过 net6.0、net5.0...)
平台工具集: Visual Studio 2022 (v143)

我们在预编译的头文件中包含 <afxwinforms.h> 以及其他几个 afx 包含,编译器在构建我们的 stdafx.h 时会出现此错误:

C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.30.30705\atlmfc\include\afxwinforms.h(30,8): 致命错误 C1107: 找不到程序集 'System.Windows. Forms.dll':请使用 /AI 或通过设置 LIBPATH 环境变量指定程序集搜索路径

从互联网上的一些搜索中,我发现并尝试使用项目的Additional #using Directories属性传递以下目录:
C:\Program Files (x86)\dotnet\shared\Microsoft.WindowsDesktop.App\6.0.0\
C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\
C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\6.0.0\

这些路径中的任何一个似乎都可以解决上述编译器错误,并且智能感知似乎也可以识别 afxwinforms.h 中的所有内容。 但是,编译器开始发出警告,例如:

C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\objidl.h(9724):消息:见“IPersist”声明
C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\objidl.h(11125):消息:见“IPersistStorage”声明
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.30.30705\atlmfc\include\afxwinforms.inl(32):消息:此诊断在导入类型“System::Windows::”时发生Forms::Control 来自程序集 'System.Windows.Forms,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089'。
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.30.30705\atlmfc\include\afxwinforms.inl(32,3): 警告 C4691: 'IQuickActivate': type referenced was expected in unreferenced模块“System.Windows.Forms.Primitives”,在当前使用的翻译单元中定义的类型
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.30.30705\atlmfc\include\afxwinforms.inl(32,3):消息:此诊断发生在导入类型 'System::Windows ::Forms::Control 来自程序集 'System.Windows.Forms, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'。
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.30.30705\atlmfc\include\afxwinforms.inl(32,3): 警告 C4691: 'IOleInPlaceUIWindow': type referenced was expected in unreferenced模块“System.Windows.Forms.Primitives”,在当前使用的翻译单元中定义的类型
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.30.30705\atlmfc\include\afxwinforms.inl(32,3):消息:此诊断发生在导入类型 'System::Windows ::Forms::Control 来自程序集 'System.Windows.Forms, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'。

在给出此错误之前:

C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.30.30705\atlmfc\include\afxwinforms.inl(32,3):致命错误 C1001:内部编译器错误。 (编译器文件 'd:\a01_work\20\s\src\vctools\Compiler\CxxFE\sl\p1\c\cpimport.cpp',第 12502 行)要解决此问题,请尝试简化或更改位置附近的程序以上所列。

所以,我的主要问题是:
是否可以这样做,我可以在 .NET6.0 中使用 CWinFormsControl 将 WinForms 控件嵌入到 MFC 对话框中吗?
如果可能的话,我在哪里出错导致上述问题?
如果不可能,是否有另一种方法可以做这样的事情:(修剪样本)

//C#
public class MyUserControl : System.Windows.Forms.UserControl
{

}

//C++
#include <afxwinforms.h>
class MyWnd : public CWnd
{
public:
    CWinFormsControl<MyUserControl> mMyControl;

    int OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        auto rc = __super::OnCreate(lpCreateStruct);
        if (rc >= 0)
        {
            CRect rcChild(0, 0, lpCreateStruct->cx, lpCreateStruct->cy);
            m_optionsControl.CreateManagedControl(WS_CHILD | WS_VISIBLE, rcChild, this, 1);
        }
        return rc;
    }
};

我可以在一个快速的小样本中重现这一点。
在 Visual Studio 2022 中创建一个新项目 CLR Empty Project (.NET)
添加头文件和源文件,包括源头文件。 #include <afxwinforms.h> 到头文件。
项目->属性->配置属性->高级:
MFC的使用:在共享DLL中使用MFC
公共语言运行时支持:(应该已经).NET Core 运行时支持 (/clr:netcore)
.NET Core 目标框架:(应该已经是)net6.0

构建项目,你应该得到一个关于找不到 System.Windows.Forms.dll 的错误。

项目->属性->配置属性-> C/C++->常规:附加#using目录:
C:\Program Files (x86)\dotnet\shared\Microsoft.WindowsDesktop.App\6.0.0\ 或
C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\ 或
C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\6.0.0<br />

再次构建,您应该得到内部编译器错误。

我试图解决同样的问题。 从 mfc 中的代码可以看出,它们目前仅支持 .net 框架。

对我有用的是复制 afxwinforms.h 和 .inl 以及“C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.32.31114\atlmfc\src\ 中的一些文件” mfcm”直接进入我的项目,因此它停止链接到 microsoft mfcmXXX.lib 并稍微调整文件以使其编译。

这是我修复它的方法:

  1. 使用 Visual Studio 2022,在 project.vcxproj 中,添加此引用:
    <ItemGroup><FrameworkReference Include="Microsoft.WindowsDesktop.App.WindowsForms" /></ItemGroup>
  1. 然后,您将在解决方案资源管理器的“外部依赖项”中看到“System.Windows.Forms.dll”。 查看此 dll 的属性,该属性位于:C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.7\ref\net6.0\System.Windows.dll
  2. 打开项目的属性,Configuration Properties -> C/C++ -> General -> Additional #Using Directories,在此处添加文件夹的完整路径。 在此处输入图像描述(我只使用 net6.0,而不是 net6.0-window)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM