代码之家  ›  专栏  ›  技术社区  ›  Eric

在“设计”视图中加载带有DLL引用的UserControl时出现问题

  •  1
  • Eric  · 技术社区  · 14 年前

                         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

    2 回复  |  直到 14 年前
        1
  •  3
  •   Hans Passant    14 年前

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

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

        2
  •  1
  •   Ádám Kovács    9 年前

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

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

    if ( !DesignerProperties.GetIsInDesignMode(this) ) 
    

    我有2个Connect()和2个Disconnect()调用来自我的DLL,在我把它放在每个场合之前,设计器现在可以完美地为UserControl加载布局了。谢谢你的解决方案。