2011-05-17 76 views
4

我使用Visual Studio 2008,.NET 3.5 SP1,并具有以下模块的测试应用程序:使用#1 为什么WPF设计器无法加载调用非托管DLL的库?

  • 一个C#

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

    当我尝试使用来自#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 
    

    错误是:“Assembly'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设计器寻找动态的地方有关库。

  • +0

    我不确定解决方法,但我相信VS/WPF Designer将程序集复制到临时位置并从那里加载它们。所以它可能不会复制你的C++ DLL。 – CodeNaked 2011-05-17 20:33:52

    +0

    我认为你非常接近正确,但并不完全。程序集(甚至是非托管程序)实际上都是复制的,但是像Rick在下面说的那样,WPF设计器无法找到它们,除非它们位于系统路径中的某个位置。 – 2011-05-17 20:52:42

    回答

    6

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

    最简单的解决办法,虽然不理想,是添加含有非托管依赖于PATH环境变量的文件夹,然后启动DevEnv.exePATH。 - >属性

  • 使用设定的路径,然后开始devenv的
  • 一个批处理文件

    • 使用计算机添加文件夹复制到系统环境变量:

      您可以通过做到这一点

      此解决方案的问题是,随着非托管依赖关系的重建,Visual Studio往往会“挂在”它们或不使用新的依赖关系,因此最终需要在使用设计器完全重建之后退出并重新启动Visual Studio这可能会有点痛苦。

    +0

    是的,这一定是这样的:设计者只在系统路径上找到我的DLL。如果我按照此处的建议(http://social.msdn.microsoft.com/Forums/en/vswpfdesigner/thread/a4cd0d5f-71dc-4b2c-977d-0a6825838160)将我的库复制到system32文件夹,而不是输出到输出文件夹,设计师发现它。所以我相信你的解决方案会起作用。不过,我真的不希望处理你所描述的过时的DLL问题。的Bleh。 – 2011-05-17 20:56:51

    +0

    @Matthew:出于设计目的,如果非托管DLL是最新的,您可能根本不在乎。它可能是一周大。试着找出最好的方法。 – 2011-05-17 21:04:02