2008-11-18 43 views
1

我已經在託管C++中創建了自定義UserControl,該自定義UserControl封裝了一些本機代碼控件。我已經確認了運行時的控件,並且一直試圖通過允許從設計器工具箱中拖放控件來使控件與Visual Studio設計器一起工作。System.IO.FileNotFoundException異常當試圖在設計器上的窗體上刪除UserControl

雖然我成功地將UserControl添加到工具箱,但是當我將控件拖到窗體上時沒有任何反應。爲了研究這個問題,我打開了第二個Visual Studio 2008實例,並將其調試器附加到了我試圖使用UserControl的devenv.exe實例中。將UserControl放到Windows窗體上後,Visual Studio調試器在嘗試加載包含UserControl的模塊時,會在mscorlib.dll中輸出FileNotFoundException。

我注意到,設計者不加載從項目的輸出路徑的dll,而是創建組件在%的UserData%\ VisualStudio的\ 9.0 \ ProjectAssemblies \ RandomFolderName文件夾的副本。但是,沒有模塊的依賴關係被複制,我相信這是FileNotFoundException的來源。

任何想法如何解決這個問題?理想情況下,Vistual Studio會在將dll複製到ProjectAssemblies文件夾時複製所有程序集的依賴關係,但我無法找到任何方法來實現此目的。

回答

1

Visual Studio不知道任何非託管依賴項。你將不得不復制dll的你的自我或複製到你的windows \ system32目錄。

另外兩個處理這個問題的策略。

  1. 用另一個程序集包裝這個程序集,然後用assembly.loadfrom手動加載你的混合dll。此功能將爲您的混合模式DLL設置正確的加載目錄。

  2. 在您的混合程序集中使用loadlibrary來加載您的本地依賴項DLL的這種方式,您可以提供它們的路徑。

+0

我很害怕這樣的情況。將文件複製到系統目錄對我來說不是理想的解決方案,並且由於Visual Studio設計器每次在表單上放置實例時都會在隨機文件夾中創建程序集副本,因此自己複製模塊也不是一個可行的解決方案。 – 2008-11-18 05:32:01

+0

windows \ system2?你的意思是c:\ Windows \ System32或c:\ Windows \ System? – bitbonk 2009-12-02 06:43:36

0

儘量不要將任何東西放在將訪問文件的控件的構造函數中。 如果必須,有時DesignTime屬性有助於跳過違規行。

1

舊的線程,但提交我的解決方案到類似的問題,因爲我剛剛遇到問題,並在過程中發現此問題。由於你正在封裝一個控件,所以它可能不像我的只是訪問類型那麼簡單。

基本上我只是將本地DLL延遲加載到我的包裝器C++/CLI庫中。由於包裝器的C++/CLI部分包含Visual Studio和框架所使用的接口規範,因此本地DLL永遠不需要或不需要加載。我在這個問題中回答了更多細節: https://stackoverflow.com/a/15481687/34440