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

我正在使用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’。确认您没有错过程序集引用。另外,请validation您的项目和所有引用的程序集是否已构建。”

但是当我在应用程序主窗口的代码隐藏中使用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环境变量中,然后使用该PATH启动DevEnv.exe

你可以这样做:

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

这个解决方案的问题在于,随着非托管依赖项的重建,Visual Studio倾向于“挂起”它们或不使用新的依赖项,因此在使用设计器正确地完全重建所有内容之后,您最终需要退出并重新启动Visual Studio。这可能有点痛苦。

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