【发布时间】: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 属性防止危险代码在设计时运行。
标签: c# winforms visual-studio-2010 user-controls visual-studio-express