.Net设计器程序集,C++\C#错误 我正在设计一个设计器重的应用程序(使用Visual C++ 2,但C的解决方案仍然是相关的)。我的设置如下:
我有一个名为“主机”的用户控件 我正在尝试一个名为“Child”的用户控件 子级包含一个类的属性,该类的类型完全在另一个dll中定义,名为“mytools.dll” Child在designer中工作得很好。但是,当我从设计器中将“child”拖到“host”上时,会出现以下错误:.Net设计器程序集,C++\C#错误 我正在设计一个设计器重的应用程序(使用Visual C++ 2,但C的解决方案仍然是相关的)。我的设置如下:,c#,.net,winforms,visual-c++,designer,C#,.net,Winforms,Visual C++,Designer,我有一个名为“主机”的用户控件 我正在尝试一个名为“Child”的用户控件 子级包含一个类的属性,该类的类型完全在另一个dll中定义,名为“mytools.dll” Child在designer中工作得很好。但是,当我从设计器中将“child”拖到“host”上时,会出现以下错误: Failed to create component 'Child'. The error message follows: 'System.io.filenotfoundexception: could not
Failed to create component 'Child'. The error message follows: 'System.io.filenotfoundexception: could not load file or assembly MyTools, Version XXXXXX, Culture=neutral
.....
{unhelpful callstack}
如果我在“child”中注释掉指向mytools.dll中的类的属性,那么一切设计都很完美。我将属性标记为“Browsable(false)和DesignerSerializable(hidden)”,但这并没有帮助
有没有一种方法可以让我明确地说“不要加载这个dll,你在设计时不需要它”,或者让我用某种方式强制从设计器以编程方式加载dll
谢谢!UserControl有一个DesignMode属性,但我不确定.NET是否希望事先解析该类型(即,如果DesignMode==true,则返回null)
或者,如果您是唯一的开发人员,则可以处理AppDomain.CurrentDomain.AssemblyResolve事件并自己加载虚拟程序集。否,这里存在鸡和蛋的问题。为了找到您应用的属性,设计器必须使用反射来加载类型。加载类型需要其me使用的任何类型这将导致CLR查找mytools.dll程序集 在设计时有效的探测路径是Visual Studio的路径,而不是你的应用程序的路径。我不清楚该路径到底是什么样子的。工具箱也起到了作用。它在私有目录中复制包含控件的程序集。要查看的位置是c:\users\yourname\appdata\local\microsoft\visualstudio\9.0\projectassemblies。这通常会出错,并且会在该目录中留下散乱的副本。当我注意到工具箱初始化开始变慢时,我必须不时手动清理它
好的,您可以检查mytools.dll的副本是否也存在,并且不是旧版本。将其放入GAC是避免出现问题的一种方法。如果属性标记为“public”,则UserControl将强制设计器加载外部程序集
您必须修改控件以返回对象,而不是错误的类型,如果必须将其保持为公共类型,则执行类型转换,否则,受保护应该可以。我已经执行了一些过期操作,如果我将上面的属性设置为私有或受保护,则设计器不会尝试加载dll。我正在进行研究,以有效地找出原因现在…这似乎是问题所在。我仍然希望我的财产是公开的,但将不得不做一个黑客工作,以避免设计师试图加载第三个组件。