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

Mat*_*owe 5 c# wpf c++-cli visual-studio-2008

我正在使用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 
Run Code Online (Sandbox Code Playgroud)

错误是:"找不到程序集'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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我修改C++/CLI程序集,删除它对C++ DLL的调用并重建所有内容,设计器就会停止抱怨并加载C++/CLI程序集而不会抱怨.

我怀疑这个问题与WPF设计者寻找动态库的地方有关.

Ric*_*key 7

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

最简单的解决办法,虽然不理想,是添加含有非托管的依赖关系到一个文件夹PATH的环境变量,然后开始DevEnv.exePATH.

你可以这样做:

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

这个解决方案的问题是,当重建非托管依赖项时,Visual Studio会"挂起"它们或者不使用新的依赖项,因此在使用设计器正确完全重建所有内容之后,最终需要退出并重新启动Visual Studio这可能有点痛苦.