我使用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");
}
答案 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静态类)。