Visual Studio 设计器无法加载文件或程序集

Posted

技术标签:

【中文标题】Visual Studio 设计器无法加载文件或程序集【英文标题】:Visual Studio designer cannot load file or assembly 【发布时间】:2015-08-04 12:04:39 【问题描述】:

我使用 Visual C++ 2010 express (win32) 创建了一个 dll。 然后将文件移动到可视 C# 2010 express (X86) 应用程序的 bin 目录(调试或发布)中,因为我想从该程序集中调用一个函数:

public MyForm()

  InitializeComponent();
  functionCall();

[DllImport("extern.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void functionCall();

一切正常。 然后我决定将这个表单的一些功能移动到一个用户控件中,其中包括这个外部函数调用。

public MyControl()

  InitializeComponent();
  functionCall();

[DllImport("extern.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void functionCall();

现在出现了一个问题:Visual Studio 设计器无法显示表单,尽管程序已执行,但它运行正常。 表单设计器上的错误如下:

无法加载文件或程序集 extern.dll 或其依赖项之一。 不支持操作。 (HRESULT 例外……)

如果我从不同的线程调用该函数(出于某种原因我需要它),Visual Studio 会崩溃而没有任何线索。 在网上,我读到了 VS 设计器显示 winform 的问题,但似乎没有人回答我的确切问题,特别是 dll 文件没有被阻止,非托管 .dll 和托管 .exe 似乎都是 32 位的。

更新: 令人难以置信的是,尽管进行了所有搜索,但我错过了唯一对我有帮助的关键字:DesignMode。 我是这样修复的:

public MyControl()

  InitializeComponent();
  if (!isDesignMode())  functionCall();


private bool isDesignMode()
 
  return (System.Diagnostics.Process.GetCurrentProcess().ProcessName.ToLower() == "vcsexpress" ||  
  System.Diagnostics.Process.GetCurrentProcess().ProcessName.ToLower() == "devenv");

【问题讨论】:

在设计时可以找到这个 DLL 的几率非常低,Windows 会在错误的目录中查找。使用 DesignMode 属性防止危险代码在设计时运行。 【参考方案1】:

Visual Studio 设计器不支持很多东西(根据我的经验——继承、泛型和各种数据库的东西)。相反,您可以做的是将不受支持的机制的任何用法包含在对DesignMode 属性的检查中:

if (this.DesignMode)

    //TODO:  some fake UI changes that represent what the external call 
    // does so what you see in the designer is more accurate

else

    //TODO: Use unsupported mechanic, such as using an external dll
    // Note that it's best to put the actual extern method definition elsewhere

问题可能是当设计器对您的类执行静态初始化时,它遇到了外部引用并立即尝试加载引用的 dll(由于某种原因它无法找到)。我发现最好将所有外部定义放在它们自己的包装类中(例如所有 User32.dll 内容的 Win32ToolKit 静态类)。

【讨论】:

以上是关于Visual Studio 设计器无法加载文件或程序集的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 如何加载库?

Visual Studio XAML 设计器未加载

Visual Studio 2015 C# XAML 设计器不加载

Visual Studio - MDF 文件 - 无法加载数据提供程序

在Visual Studio Designer中找不到自定义字体的C#文件

visualstudio的窗体设计中led在哪里