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

时间:2015-08-04 12:04:40

标签: c# winforms visual-studio-2010 user-controls visual-studio-express

我使用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();

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

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");
}

1 个答案:

答案 0 :(得分: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
}

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