【问题标题】:Why my WPF program cannot run without Visual Studio?为什么我的 WPF 程序在没有 Visual Studio 的情况下无法运行?
【发布时间】:2013-09-21 14:06:00
【问题描述】:

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

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

【问题讨论】:

  • 这可能取决于您的连接字符串的路径

标签: c# wpf


【解决方案1】:

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

问题标题并不准确,因为它与 Visual Studio 并不真正相关。 MultiStart.exe 取决于配置 (MultiStart.exe.config) 以及其他程序集 (System.Data.SQLite.dll)。没有这些依赖项,应用程序将无法运行(因为 .NET 就是这样工作的)。

WPF 不一定需要配置文件来运行,所以问题是应用程序需要的配置文件中有什么。可以将此配置信息移动到代码中(例如连接字符串)并删除 app.config,但随后这些值将被硬编码到应用程序中。

就依赖程序集而言,可以将它们作为资源嵌入而不是部署它们,然后使用AppDomain.AssemblyResolve Event 从资源中读取程序集(参见Embedding assemblies inside another assembly 示例)。

另一种不将程序集作为资源嵌入的方法是将它们合并到一个程序集中。 ILMerge 是合并程序集的流行选择,但我读到它可能与 WPF 程序集有问题(不确定这是否适用于您)。有关将程序​​集与 WPF 合并的其他一些想法,请参阅 Merging dlls into a single .exe with wpf

请注意,设置 PATH 变量不起作用,因为 .NET 不使用 PATH 来解析程序集——有关详细信息,请参阅How the Runtime Locates Assemblies

另一个选项不是将MultiStart.exe 复制到桌面,而是使用桌面上链接到相应目录的快捷方式。也许这是一个更简单的解决方案

【讨论】:

    【解决方案2】:

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

    有关 ILMerge 的更多详细信息,请点击此处:ILMerge on CodeProject

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

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

          除非你停止使用 SQLite,否则你没有办法不需要那个 DLL(虽然有很多方法可以打包/引用它)。

          【讨论】:

            猜你喜欢
            • 2016-02-17
            • 2023-04-08
            • 1970-01-01
            • 1970-01-01
            • 2011-04-10
            • 1970-01-01
            • 2015-11-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多