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

时间:2011-05-17 20:22:18

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

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

  1. 一个C ++ DLL
  2. 使用#1
  3. 的C ++ / CLI DLL
  4. 使用#2
  5. 的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设计人员寻找动态库的地方有关。

2 个答案:

答案 0 :(得分:7)

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

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

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

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

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

答案 1 :(得分:0)

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