为什么 WPF 设计器无法加载调用非托管 DLL 的库?

2024-01-03

我正在使用 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 设计器寻找动态库的位置有关。


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

最简单的解决方案(尽管并不理想)是将包含非托管依赖项的文件夹添加到PATH环境变量,然后启动DevEnv.exe接着就,随即PATH.

您可以通过以下方式执行此操作:

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

此解决方案的问题在于,当重建非托管依赖项时,Visual Studio 往往会“保留”它们或不使用新的依赖项,因此在使用设计器正确完全重建所有内容后,您最终需要退出并重新启动 Visual Studio,并且这可能有点痛苦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 WPF 设计器无法加载调用非托管 DLL 的库? 的相关文章

随机推荐