gpt4 book ai didi

visual-studio-2012 - 使用第 3 方 DLL 部署 WPF 应用程序

转载 作者:行者123 更新时间:2023-12-03 21:22:31 27 4
gpt4 key购买 nike

我在尝试部署我创建的 C#/WPF 应用程序时非常沮丧,该应用程序有一些对 3rd 方 DLL 的引用。我在项目中创建了一个文件夹,名为lib ,我放置所有这些 DLL 的地方。在 VS2012 中,我通过浏览到该文件夹​​并选择所有 DLL 来添加引用。 Copy Local设置为 true对所有人。当我构建和运行时一切都很好,但是当我选择发布并创建 OneClick 安装程序时,事情就不那么顺利了。在发布向导期间,我将其设置为从磁盘安装,并将其设置为从不检查更新。我拿了那个文件夹,把它放在闪存驱动器上,把它插到另一台电脑上,运行安装程序,它抛出一个异常。我相信我知道发生了什么,但我不知道如何打包以正确部署它。

我的 DLL 之一是为 C++ 项目设计的 DLL 的 C# 包装器。我们会说,Application需要 DLL1DLL1需要 DLL2 . DLL2由于不是 .NET,无法在项目中添加为引用动态链接库。 DLL1需要 DLL2位于同一个文件夹中以便提取。我正在使用 CefSharp包装了 Chromium Embedded Framework .

我已经尝试将 CefSharp.dll 所需的 DLL 放在 publish/Application Files 中目录,但它没有工作。我注意到 VS2012 中的所有 DLL 都有一个 .deploy他们的扩展名,我什至去添加该扩展名,看看它是否正在扫描以获取该扩展名,但它也不起作用。这是我第一次为 Windows 应用程序进行开发和部署,我读过的 MSDN 上的所有教程或博客文章似乎都没有涵盖这种情况,而且我在部署管理器中没有看到任何其他选项来处理这些案件类型。

如果有帮助,抛出的异常代码是:CLR20r3
当我捕获并显示异常时,我提供的所有信息基本上都是 CefSharp.dll or one of it's dependencies cannot be loaded .我以前在 DLL2 时得到的与 DLL1 不在同一个文件夹中.

任何人都可以提供有关如何在这种情况下从 VS2012 部署的帮助吗?

提前致谢!

编辑:信息更新

我试图在没有安装 Visual Studio 的情况下将调试版本推送到测试机器。为 CefSharp 构建时或任何其他 C++ 运行时 DLL ,它将查找 DLL 的所有调试版本它们通常是相同的名称,但在末尾添加了字母“d”。如下所述,C++ 运行时的调试版本不可再分发。并不是说你不能手动添加那些 DLLs到您的项目并将它们设置为 Copy Always ,但那是一种黑客工作。我从头开始了一个新项目,添加了 DLL 的所有发布版本,构建了,一切都很好。

最佳答案

今天早上我一直在努力解决这个问题,最终找到了解决方案。似乎您已经知道 CefSharp 需要哪些 DLL 等,但我想我会解决这个问题,以防其他人遇到同样的问题。我有一个 C# WPF 应用程序,我使用 CefSharp 作为 Web View 。我使用 CefSharp v1 是因为我需要他们提供的 JavaScript -> C# 桥接器,但尚未在 v3 中实现。以下是我在设置项目时所经历的粗略步骤(我使用的是 VS2013,但这可能适用于 VS2012)。
安装 CefSharp

  • 通过 NuGet 安装 CefSharp.Wpf(我使用的是 v1.25.7)
  • 那应该把相关文件放在$(SolutionDir)packages\CefSharp.Wpf.1.25.7\cef

  • 配置构建
  • 要将 CefSharp DLL 复制到我们的构建文件夹,请右键单击您的项目,选择 Properties -> Build Events 并在“Post-build event command line”中输入以下内容:

    xcopy "$(SolutionDir)packages\CefSharp.Wpf.1.25.7\cef*" "$(TargetDir)" /s /y /i


  • 现在应该从 cef 文件夹以及 devtools_resources.pak 复制所有需要的 DLL。文件和 locales文件夹加上其内容。我需要在我的项目中使用它们,因为我需要 Chrome 开发工具。
  • 仔细检查您的项目引用包含 CefSharpCefSharp.Wpf .这应该由 NuGet 处理。

  • 处理 Visual C++ 2012 运行时文件
  • 我不希望用户必须下载整个 Visual C++ 2012 运行时文件作为部署的一部分,因此通过 Visual Studio 添加文件夹 Lib\Microsoft.VC110.CRT并将计算机上以下文件夹中的 3 个 DLL( msvcp110.dllmsvcr110.dllvccorlib110.dll )添加到您刚刚在项目中创建的文件夹中:C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\redist\x86\Microsoft.VC110.CRT
  • 在 Visual Studio 中选择 3 个 DLL 文件,右键单击 -> 属性。确保构建操作设置为“无”,并将复制到输出目录设置为“不复制”。现在,您需要添加另一个构建后事件,以确保正确复制这些事件(即复制到根目录,以便它们与 CEF dll 和您的项目 exe 放在一起)以进行调试。
  • 右键单击您的项目,选择“属性”->“构建事件”,然后在 CEF 的其他 xcopy 命令之后的“构建后事件命令行”中输入以下内容:

    xcopy "$(ProjectDir)Lib\Microsoft.VC110.CRT*.*" "$(TargetDir)" /s /y /i



  • 在这一点上,一切都应该建立起来。要使用 ClickOnce 发布应用程序,我需要它推送所有 CEF DLL,并确保存在 Chromium 开发工具所需的文件/文件夹。如果您不需要开发工具或所有 DLL,那么您可以相应地调整它。
    确保使用 ClickOnce 部署 CEF 和 C++ 运行时文件
  • 在 Visual Studio 中右键单击您的项目并选择“卸载项目”。
  • 右键单击并选择编辑 csproj 文件。
  • 收盘前</Project>标签添加这个
    <ItemGroup>
    <Content Include="$(SolutionDir)packages\CefSharp.Wpf.1.25.7\cef\**\*">
    <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
    <Visible>false</Visible>
    </Content>
    </ItemGroup>

    <ItemGroup>
    <Content Include="$(ProjectDir)Lib\Microsoft.VC110.CRT\**\*">
    <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
    <Visible>false</Visible>
    </Content>
    </ItemGroup>
  • 这会将 cef 文件夹中的所有内容添加到项目中,并确保在部署时将 C++ 二进制文件复制到项目的根目录中。对于 CEF,我使用的是 \**\* Include 和 %(RecursiveDir) 末尾的语法以确保复制所有文件以及 locales保留其内容和结构的文件夹。已设置 <Visible>false</Visible>您不会在解决方案资源管理器中看到这些项目。

  • 放松
    现在,如果您发布应用程序,它应该复制所有必需的文件和文件夹。

    关于visual-studio-2012 - 使用第 3 方 DLL 部署 WPF 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22841585/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com