【问题标题】:Problem loading UserControl with DLL reference in Design View在设计视图中使用 DLL 引用加载 UserControl 时出现问题
【发布时间】:2010-07-23 20:33:11
【问题描述】:

我有一个包含 UserControl 的 C# 项目。

此用户控件依赖于特定的 C++ 混合模式 dll,而后者又充当非托管 C++ DLL 的外观

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

在设计视图中,我无法添加用户控件。它说 OCShell(或其依赖项之一)上有一个 FileNotFoundException。但是,通过代码,一切正常。在主应用程序(Windows 窗体)中我可以

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

这很好用。正确的代码得到正确执行。

我检查了Dependency Walker,一切正常。一切都被正确复制到 Bin\Debug\ 目录,并且每个 DLL 都可以看到对方。

我的猜测是设计视图编辑器没有检查这些 DLL 的正确路径,因此返回错误。

我还尝试将每个 dll 复制到我的解决方案中的每个可能的目录,但这也无济于事

【问题讨论】:

    标签: c# dll user-controls filenotfoundexception design-view


    【解决方案1】:

    是的,这是个问题。问题在于代码在 Visual Studio 中执行,而不是在您的应用程序中执行。用于查找依赖程序集的探测路径将仅包括 VS 的私有目录(Common7\IDE\PrivateAssemblies 和 PublicAssemblies),而不包括项目的构建目录。您可以通过将 OCShell.dll 复制到其中一个目录中来使其找到它,但是非托管 DLL 必须放在 Window 在查找 DLL 时将搜索的目录中。除了需要清单的 Windows 并行缓存之外,它仅限于系统 PATH 环境变量中的目录。

    这些不是令人愉快的选择。最好的办法是确保这些 DLL 中的代码不能在设计时执行。您可以通过使用 DesignMode 属性来执行此操作,如果它为 True,则绕过调用。这至少需要在构造函数和 Load 事件中完成。其他事件也可以运行。还极大地减少了由于非托管代码中的错误而导致 Visual Studio 崩溃的可能性。如果这会影响控件的设计时视图,那么您可能需要编写一个设计器来弥补这一点。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题。如果您有一个 DLL,它使用许多其他 DLL,并且可能是用 C++ 编写的,它通常需要许多其他依赖项。在运行时,它们得到完美解决,但不是在设计模式下。

      使用 Hans Passant 的答案,您需要将此代码放在与此 DLL 相关的每个函数调用之前。

      if ( !DesignerProperties.GetIsInDesignMode(this) ) 
      

      我从我的 DLL 中调用了 2 个 Connect() 和 2 个 Disconnect(),在我每次都将它放在之前,设计器现在可以完美地加载 UserControl 的布局。感谢您的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多