1

我有一个带有 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 复制到解决方案中的每个可能目录,但这也无济于事

4

2 回答 2

3

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

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

于 2010-07-23T20:46:36.220 回答
1

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

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

if ( !DesignerProperties.GetIsInDesignMode(this) ) 

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

于 2015-03-10T13:48:04.947 回答