2

我制作了一个 WPF 程序,它使用SQLite. 并且通过使用 Visual Studio 2012,它生成了两个版本DebugReleaseexe 文件。当我进入DebugorRelease目录并运行我的 exe 文件时,例如MultiStart.exe,它可以正常运行。

但是如果我将它复制MultiStart.exe到我的桌面并尝试运行它,它就会失败。通过几次测试,我发现我还需要将文件复制MultiStart.exe.configSystem.Data.SQLite.dll我的桌面。然后它现在可以运行了。但为什么?我们是否有更好的解决方案,以便我可以在不添加文件的情​​况下运行它?谢谢!

4

5 回答 5

1

您还可以使用 ILMerge 将所有依赖项合并到单个 .exe 文件中,以简化应用程序的分发。

可以在此处找到有关 ILMerge 的更多详细信息:ILMerge on CodeProject

使用示例:ilmerge /target:winexe /out:YourDestinationApp.exe YourCurrentProgram.exe System.Data.SQLite.dll

于 2013-09-21T14:38:49.683 回答
1

为什么我的 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到桌面,而是使用桌面上链接到相应目录的快捷方式。也许这是一个更简单的解决方案

于 2013-09-21T15:02:09.643 回答
0

因为您缺少 PATH 中的内容。Visual Studio 可能设置为在构建时将 DLL 复制到目标目录。

您几乎可以肯定会引入外部库。其中一些是 .NET 的一部分,而另一些则打包在特定文件夹中的库中。当您启动 exe 时,它​​会在您的 PATH当前文件夹中查找所有内容(包括 Visual Studio 复制的所有 DLL)。

当您将 exe 移动到桌面时,它突然不知道这些 DLL 在哪里。您没有专门将它们添加到您的 PATH 中,它们不再位于当前文件夹中。这就是为什么将这些 DLL 复制到您的桌面神奇地使它们工作的原因。

除非您停止使用 SQLite,否则您无法不需要该 DLL(尽管有很多方法可以打包/引用它)。

于 2013-09-21T14:10:36.960 回答
0

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

于 2013-09-21T14:14:57.953 回答
0

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

于 2013-09-21T14:16:38.133 回答