将一个 Unity .exe 文件嵌入到多个 WPF 页面中

Posted

技术标签:

【中文标题】将一个 Unity .exe 文件嵌入到多个 WPF 页面中【英文标题】:Embed one Unity .exe file into multiple WPF Pages 【发布时间】:2021-10-15 11:54:27 【问题描述】:

我有一个嵌入 Unity3D 应用程序的 WPF 应用程序,类似于:Embed Unity3D app inside WPF application

使用 WindowsFormsHost 和 WinForms:Panel 嵌入到 WPF 页面中

<WindowsFormsHost><WinForms:Panel x:Name="MyGame"/></WindowsFormsHost>

现在,我的应用程序要求我在 WPF 应用程序的不同页面上显示不同的 Unity.exe 场景。例如,在 Page1 上 Unity.exe 显示 Scene1,在 Page2 上 Unity.exe 显示 Scene2。我有一个 TCP 通信来在场景之间切换。

实现此目的的一种方法是在每次用户导航到新页面时终止运行 Unity.exe 的进程并重新启动它。但是,这将导致用户每次都等待 Unity.exe 加载。因此,是否可以嵌入在一个进程上运行的 .exe 文件并将其显示在多个 WPF 页面上?不知何故,当用户导航到没有嵌入的普通页面时,我喜欢让进程在后台运行。

我的直觉是,将 .exe 文件嵌入到用户控件中可能是一种可能的解决方案,但到目前为止我还没有找到足够的信息。

【问题讨论】:

【参考方案1】:

我是another related question on Stack Overflow 上其中一个答案的作者。我创建了a repository,它是您存储库的一个分支,具有您想要的行为。

我看到你喜欢使用 Frames,这没关系,但正因为如此,我为你修复了两个关于原始存储库的不良行为。

使用MainWindow.xamlFrame 中的属性NavigationUIVisibility="Hidden" 可以避免导航面板仍然显示的事实。

您还通过电子邮件告诉我“第二次”单击按钮时,WinformsHost 没有出现。这是因为更改Frame 的内容并不是根据定义触发刷新。您可以通过 Page2_UnityFrame.NavigationService.Refresh(); 行强制刷新,Page3Page4 类似。

我使用此代码进行了测试,现在我认为该行为完全符合您的要求。不过,我想借此机会就这个版本的应用程序提供一些额外的建议。

我冒昧地放置了您的 Unity 文件(和相关文件夹)并将它们重新定位到名为 All_Unity_Files 的文件夹中。然后,在容器项目的构建后事件中,我可以指定需要将这些 Unity 文件(和文件夹)复制到目标目录。这是通过命令完成的:xcopy "$(SolutionDir)..\All_Unity_Files" "$(TargetDir)" /s /y /r /d。因此,如果您现在下载此代码或克隆存储库,如果构建成功,所需的 Unity 文件会自动位于正确的目录中以启动应用程序。 其次,我还将页面的Frames重命名为Page1_UnityFramePage2_UnityFrame等。之前,这些框架和 MainWindow.xaml 中的主框架都具有相同的 x:Name (UnityFrame),这是我不推荐的。如果您更改代码隐藏,则很难确定您正在获取或设置哪个框架,因此更难以调试。 作为第三点也是最后一点,我建议您了解通过 MVVM 进行数据绑定的可能性。这将最大限度地减少代码隐藏中的代码量,特别是如果您的应用程序会增长,它会更容易维护。

【讨论】:

非常感谢 Joachim 的帮助!该解决方案解决了我们项目的所有需求。 不客气!

以上是关于将一个 Unity .exe 文件嵌入到多个 WPF 页面中的主要内容,如果未能解决你的问题,请参考以下文章

如何将附属程序集嵌入到 EXE 文件中

将现有的 exe 文件嵌入到另一个程序中

将dll文件嵌入exe程序

C#将引用的dll嵌入到exe文件中

如何在PowerShell脚本中嵌入EXE文件

C++ 将外部 .exe 嵌入到我编译的 .exe 中