簡體   English   中英

在Design View中使用DLL引用加載UserControl時出現問題

[英]Problem loading UserControl with DLL reference in Design View

我有一個帶有UserControl的C#項目。

此用戶控件依賴於特定的C ++混合模式dll,而后者又充當非托管C ++ DLL的外觀

                     C#           C++ Mixed            C++ Umnanaged
  [ main app ] ---> [ myUC ] ---> [ OCShell.dll ] ---> [ OCC.dll ]

在設計視圖中,我無法添加UserControl。 它說OCShell上有一個FileNotFoundException(或者它的一個依賴項)。 但是,通過代碼,一切正常。 在主應用程序(Windows窗體)我可以

myUC uc = new myUC();
this.Controls.Add(uc);

這很好用。 正確的代碼得到正確執行。

我檢查了Dependency Walker ,一切都很好。 一切都被正確復制到Bin \\ Debug \\目錄,每個DLL都看到對方。

我的猜測是,設計視圖編輯器不會檢查這些DLL的正確路徑,從而返回錯誤。

我也嘗試將每個dll復制到我的解決方案中的每個可能的目錄,但這也沒有幫助

是的,這是一個問題。 問題是代碼是在Visual Studio中執行的,而不是您的應用程序。 用於查找依賴程序集的探測路徑將僅包含VS(Common7 \\ IDE \\ PrivateAssemblies和PublicAssemblies)的私有目錄,而不包括項目的構建目錄。 您可以通過將其復制到其中一個目錄中來查找OCShell.dll,但是非托管DLL將必須放在Window將在查找DLL時搜索的目錄中。 除了需要清單的Windows並行緩存之外,其中只限於系統PATH環境變量上的目錄。

這些都不是愉快的選擇。 最好的辦法是確保這些DLL中的代碼不能在設計時執行。 您可以使用DesignMode屬性執行此操作,如果它為True,則繞過調用。 這至少需要在構造函數和Load事件中完成。 其他活動也可以運行。 由於非托管代碼中的錯誤,還可以極大地降低因Visual Studio崩潰的幾率。 如果這會影響控件的設計時視圖,那么您可能需要編寫一個設計器來彌補它。

我有同樣的問題。 如果你有一個DLL,它使用許多其他DLL,並且可能用C ++編寫,它通常需要許多其他依賴項。 在運行時,它們可以完美地解析,但不能在設計模式下解析。

使用Hans Passant的答案,您需要將此代碼放在與此DLL相關的每個函數調用之前。

if ( !DesignerProperties.GetIsInDesignMode(this) ) 

我從我的DLL中進行了2次Connect()和2次Disconnect()調用,並且在每次使用之后,Designer都可以完美地加載UserControl的布局。 謝謝你的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM