2011-05-17 77 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