【问题标题】:Why does the WPF designer fail to load libraries that call into unmanaged DLLs?为什么 WPF 设计器无法加载调用非托管 DLL 的库?
【发布时间】:2011-08-27 13:20:26
【问题描述】:

我正在使用 Visual Studio 2008、.NET 3.5 SP1,并且有一个包含以下模块的测试应用程序:

  1. 一个 C++ DLL
  2. 使用#1 的 C++/CLI DLL
  3. 使用#2 的 C# WPF 应用程序

当我尝试将 #2 中的类用作 WPF XAML 中的资源时,设计器不会让我这样做:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:lib1="clr-namespace:ClassLibrary1;assembly=ClassLibrary1" <- ERROR 

错误是:“未找到程序集 'ClassLibrary1'。请确认您没有丢失程序集引用。另外,请确认您的项目和所有引用的程序集都已构建。”

但是,当我在应用程序主窗口的代码隐藏中使用 C++/CLI DLL 中的类时,一切正常。 Class1 被创建,并在其构造函数中调用 C++ DLL,没问题。

using ClassLibrary1;

...

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();

        //use in code-behind
        Class1 tmp = new Class1();
        tmp.FirstName = "foo";
        Title = tmp.FirstName;
    }
}

如果我修改 C++/CLI 程序集,删除它对 C++ DLL 的调用并重建所有内容,设计者将停止抱怨并毫无怨言地加载 C++/CLI 程序集。

我怀疑这个问题与 WPF 设计器查找动态库的位置有关。

【问题讨论】:

  • 我不确定解决方法,但我相信 VS/WPF 设计器将程序集复制到一个临时位置并从那里加载它们。所以它可能不是在复制你的 C++ DLL。
  • 我认为您非常接近正确,但并不完全正确。程序集(甚至是非托管程序集)实际上是被复制的,但就像 Rick 在下面所说的那样,WPF 设计人员无法找到它们,除非它们位于系统路径上的某个位置。

标签: c# wpf visual-studio-2008 c++-cli


【解决方案1】:

因为 Visual Studio 设计器将您的程序集复制到一个临时位置,但不复制您的非托管依赖项,您可能会遇到此问题。

虽然并不理想,但最简单的解决方案是将包含非托管依赖项的文件夹添加到 PATH 环境变量中,然后使用 PATH 启动 DevEnv.exe

您可以通过以下方式做到这一点:

  • 使用计算机 -> 属性将文件夹添加到系统环境变量中
  • 使用批处理文件设置路径,然后启动 DevEnv

此解决方案的问题在于,在重建非托管依赖项时,Visual Studio 倾向于“挂在”它们或不使用新的依赖项,因此您最终需要在使用设计器后退出并重新启动 Visual Studio重建一切,这可能有点痛苦。

【讨论】:

  • 是的,一定是这样:设计者只有在系统路径上找到我的 DLL。如果我按照此处的建议将我的库复制到 system32 文件夹 (social.msdn.microsoft.com/Forums/en/vswpfdesigner/thread/…),而不是复制到输出文件夹中,设计师会找到它。所以我相信你的解决方案会奏效。不过,我真的不期待处理您所描述的过时 DLL 问题。呜呜。
  • @Matthew:出于设计目的,您可能根本不关心非托管 DLL 是否是最新的。它可能是一个星期大。尝试找出最有效的方法。
【解决方案2】:

不是一个真正的解决方案,但有时它会有所帮助:使用“AnyCPU”(不是“x64”,因为设计器是 32 位进程)重建并在“发布”模式下,关闭并重新打开 Visual Studio。而且,是的:这很烦人......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 2019-08-15
    • 1970-01-01
    • 2016-08-25
    • 2014-08-17
    • 2010-12-17
    • 1970-01-01
    • 2016-12-13
    相关资源
    最近更新 更多