为什么我的WPF程序不能在没有Visual Studio的情况下运行?

fruv7luv  于 2023-08-07  发布在  其他
关注(0)|答案(5)|浏览(116)

我做了一个使用SQLite的WPF程序。通过使用Visual Studio 2012,它生成DebugRelease版本的exe文件。当我转到DebugRelease目录并运行我的exe文件时,例如MultiStart.exe,可以正常运行。
但是如果我把MultiStart.exe复制到我的桌面上并尝试运行它,它就失败了。通过几次测试,我发现我还需要将文件MultiStart.exe.configSystem.Data.SQLite.dll复制到我的桌面上。现在它可以运行了。但是为什么?我们有更好的解决方案,这样我就可以让它运行没有额外的文件?

tvokkenx

tvokkenx1#

为什么我的WPF程序不能在没有Visual Studio的情况下运行?
这个问题的标题并不准确,因为它与Visual Studio并不相关。MultiStart.exe依赖于配置(MultiStart.exe.config)以及其他程序集(System.Data.SQLite.dll)。没有这些依赖项,应用程序就无法运行(因为.NET就是这样工作的)。
WPF不一定需要配置文件来运行,所以问题是应用程序需要的配置文件中有什么。可以将该配置信息移动到代码中(例如,连接字符串)并删除app.config,但随后这些值将在应用程序中硬编码。
就依赖程序集而言,可以将其作为资源嵌入,然后使用AppDomain.AssemblyResolve Event从资源读取程序集,而不是部署它们(有关示例,请参阅将程序集嵌入另一个程序集)。
另一种不将程序集作为资源嵌入的方法是将它们合并到一个程序集中。ILMerge是合并程序集的流行选择,但我读到它可能会与WPF程序集有问题(不确定是否适用于您)。有关使用WPF合并程序集的其他一些想法,请参见Merging dlls into a single .exe with wpf
请注意,设置PATH变量不起作用,因为.NET不使用PATH来解析程序集--有关详细信息,请参阅How the Runtime Locates Assemblies
另一个选择是使用桌面上的快捷方式链接到相应的目录,而不是将MultiStart.exe复制到桌面。也许这是一个更简单的解决方案

pieyvz9o

pieyvz9o2#

您还可以使用ILMerge将所有依赖项合并到单个.exe文件中,以简化应用程序的分发。
有关ILMerge的更多详细信息,请参见此处:ILMerge on CodeProject
用法示例:第一个月

bpzcxfmw

bpzcxfmw3#

更好的解决方案,我用来做我的windows窗体应用程序是,复制整个文件夹,其中包含支持文件。把它放在你想要的地方。然后在桌面上创建.exe的快捷方式。这对我一直很有效。

cl25kdpy

cl25kdpy4#

因为你缺少了一些依赖。你可以打开你的配置文件并设置依赖项……但我不建议你手动更改配置文件。您也可以复制system32文件夹中的依赖dll。..但这只是一个技巧,因为exe首先搜索当前文件夹中的dll,而不是系统32文件夹。

sczxawaw

sczxawaw5#

因为你在你的道路上错过了一些东西。VisualStudio可能设置为在生成时将DLL复制到目标目录。
几乎可以肯定的是,您正在引入外部库。其中一些是.NET的一部分,而另一些则打包在特定文件夹中的库中。启动exe时,它会在PATH * 和 * 当前文件夹中查找所有内容(包括Visual Studio复制的所有DLL)。
当你把exe移到桌面上时,它突然不知道那些DLL在哪里了。您没有将它们专门添加到PATH中,并且它们不再位于当前文件夹中。这就是为什么将这些DLL复制到您的桌面会神奇地使它们工作。
除非你停止使用SQLite,否则没有办法让你不需要那个DLL(尽管有很多方法可以打包/引用它)。

相关问题