为什么我的 WPF 程序在没有 Visual Studio 的情况下无法运行
本文关键字:Studio 情况下 运行 Visual WPF 我的 程序 为什么 | 更新日期: 2023-09-27 18:32:25
我做了一个使用SQLite的WPF程序。通过使用Visual Studio 2012,它会生成Debug
和Release
版本的exe文件。当我转到Debug
或Release
目录并运行我的exe文件时,例如 MultiStart.exe
,它可以正常运行。
但是,如果我将MultiStart.exe
复制到我的桌面并尝试运行它,它会失败。通过几次测试,我发现我还需要将文件MultiStart.exe.config
和System.Data.SQLite.dll
复制到我的桌面。然后它现在可以运行了。但是为什么?我们是否有更好的解决方案,以便我可以在没有其他文件的情况下运行它?
为什么我的 WPF 程序在没有 Visual Studio 的情况下无法运行?
问题标题并不准确,因为它与Visual Studio并不真正相关。 MultiStart.exe
取决于配置(MultiStart.exe.config
)以及其他组件(System.Data.SQLite.dll
)。 如果没有这些依赖项,应用程序将无法运行(因为这就是 .NET 的工作方式)。
WPF 不一定需要配置文件才能运行,因此问题是应用程序需要配置文件中的内容。 可以将此配置信息移动到代码(例如连接字符串)中并删除 app.config,但随后这些值将在应用程序中硬编码。
就依赖程序集而言,可以将它们作为资源嵌入,然后使用 AppDomain.AssemblyResolve 事件从资源读取程序集,而不是部署它们(有关示例,请参阅在另一个程序集中嵌入程序集)。
另一种不是将程序集作为资源嵌入的方法是将它们合并到一个程序集中。 ILMerge 是合并程序集的流行选择,但我读到它可能与 WPF 程序集有问题(不确定这是否适用于您)。 有关将程序集与 WPF 合并的其他一些想法,请参阅使用 wpf 将 dll 合并到单个.exe中。
请注意,设置 PATH 变量不起作用,因为 .NET 不使用 PATH 来解析程序集 - 有关详细信息,请参阅运行时如何定位程序集。
另一个选项不是将MultiStart.exe
复制到桌面,而是使用桌面上链接到相应目录的快捷方式。 也许这是一个更简单的解决方案
还可以使用 ILMerge 将所有依赖项合并到单个.exe文件中,以简化应用程序的分发。
更多关于ILMerge的拘留可以在这里找到:ILMerge on CodeProject
用法示例:ilmerge /target:winexe /out:YourDestinationApp.exe
YourCurrentProgram.exe System.Data.SQLite.dll
我过去对我的 Windows 窗体应用程序做的更好的解决方案是, 复制包含支持文件的整个文件夹。 将其放置在您想要的位置。 然后在桌面上创建.exe快捷方式。这总是对我有用。
因为你缺少一些依赖关系。您可以打开配置文件并设置依赖项...但我不建议您手动更改配置文件。您还可以复制 system32 文件夹中的依赖 dll。..但这只是一个技巧,因为 exe 首先在当前文件夹中搜索 DLL 而不是系统 32 文件夹。
因为你从你的 PATH 中遗漏了一些东西。Visual Studio 可能设置为在生成时将 DLL 复制到目标目录。
您几乎可以肯定正在引入外部库。其中一些是 .NET 的一部分,而另一些则打包在特定文件夹中的库中。当你启动你的exe时,它会在你的PATH和当前文件夹中查找所有内容(包括Visual Studio复制的所有DLL)。
当您将 exe 移动到桌面时,它突然不知道这些 DLL 在哪里。您尚未专门将它们添加到 PATH 中,并且它们不再位于当前文件夹中。这就是为什么将这些 DLL 复制到桌面神奇地使它们工作的原因。
除非你停止使用SQLite,否则你没有办法不需要那个DLL(有很多方法可以打包/引用它)。