设计者拒绝用户控制

Nic*_*las 8 dll user-controls designer c++-cli visual-studio

我有一个使用/ CLR编译的C++'Control Library Project'.在这个项目中,有一个用户控件可以调用本机DLL.此用户控件应该出现在设计器工具箱中,但我无法将其拖到窗体上.如果没有对DLL的引用,用户控件可以正常使用,但是在引用时我只是在尝试使用它时收到消息"无法加载工具箱项".

本机调用功能正常,无论如何都不会损害用户控件.通过包含DLL调用,可以在设计器中自行查看用户控件.此外,如果将控件手动添加到表单并作为程序执行,它也将显示正常.

这让我怀疑问题只是Visual Studio Designer需要知道本机DLL所在的位置.但我不知道如何告诉它,或者在哪里放置DLL以便它可以找到它.据我所知,在项目设置中没有办法引用本机DLL.所以对我来说,设计师只是在抱怨因为它无法使用它是有道理的.

有没有办法让这项工作?

Cod*_*ray 10

不幸的是,你在VS中遇到了"设计错误"(换句话说,就是"功能").

您怀疑问题是Visual Studio设计者需要知道本机DLL所在位置的问题,这是部分正确的.这不是对它的位置无知的问题,而是设计师无法反映混合模式程序集(包含托管代码和本机代码的程序集)以实例化控件的事实.这导致工具箱显示您记下的错误.

解决方法是使用以编译C++源文件/clr:pure来创建纯托管的EXE.


另一种可能性(也就是VS中的"设计错误")是您尝试添加的控件已编译为64位组件.因为Visual Studio是一个32位进程,所以它只能执行32位模块.虽然它允许您添加对64位程序集的引用,但它实际上无法JIT编译该64位程序集并在进程中执行它.

此处的解决方法是使用"AnyCPU"设置编译用户控件程序集,这将使其在32位环境中以32位进程执行,在64位环境中以64位进程执行.真的,假设你已经正确编写了代码,这是两全其美的.


最后,如果这些都不起作用,总会有绕过设计师的选择.您仍然可以编写实例化用户控件所需的代码,并在表单的初始化程序中设置其属性.您将失去的只是能够在Visual Studio中使用设计器内部的控件.一切都会在运行时按预期工作.