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 2015 C# XAML 设计器不加载
Visual Studio - MDF 文件 - 无法加载数据提供程序