【问题标题】:.Net Designer assemblies, C++\C# error.Net Designer 程序集,C++\C# 错误
【发布时间】:2010-04-06 13:34:11
【问题描述】:

我正在开发一个需要大量设计器的应用程序(使用 Visual C++ 2.0,但 C# 解决方案仍然应该是相关的)。我的设置是这样的:

我有一个名为“Host”的用户控件 我正在尝试一个名为“Child”的用户控件

Child 包含一个类的属性,该类的类型完全在不同的 dll 中定义,名为“mytools.dll”

Child 在设计器中工作得很好。但是,当我从设计器中将“child”拖到“host”上时,出现以下错误:

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?

谢谢!

【问题讨论】:

    标签: c# .net winforms visual-c++ designer


    【解决方案1】:

    如果属性标记为“公共”,则用户控件将强制设计器加载外部程序集。

    你必须重新设计你的控件以返回 Object 而不是坏类型,如果你必须保持它公开,则进行类型转换,否则,protected 应该没问题。

    【讨论】:

    • 这似乎是问题所在。我仍然希望我的财产是公开的,但必须做一个黑客工作以避免设计师试图加载第三个程序集。
    【解决方案2】:

    不,这里存在先有鸡还是先有蛋的问题。为了找到您应用的属性,设计者必须使用反射来加载类型。加载该类型还需要加载其成员使用的任何类型。这将导致 CLR 去寻找你的 mytools.dll 程序集。

    在设计时有效的探测路径适用于 Visual Studio,而不是您的应用。这条路到底是什么样子对我来说是模糊的。工具箱也发挥了作用。它在私有目录中制作包含控件的程序集的副本。要看的地方是 c:\users\yourname\appdata\local\microsoft\visualstudio\9.0\projectassemblies。这经常出错,并且在该目录中留下了杂散的副本。当我注意到工具箱初始化开始变慢时,我必须不时手动清理它。

    好吧,您可以检查一下 mytools.dll 的副本是否也存在于那里并且不是旧版本。将其提交给 GAC 是避免麻烦的一种方法。

    【讨论】:

    • 我做了一些实验,如果我将上面的属性设置为私有或受保护,设计者不会尝试加载 dll。我正在做研究以有效地弄清楚为什么现在......
    【解决方案3】:

    UserControl 有一个 DesignMode 属性,但我不确定 .NET 是否要预先解析该类型(即,如果 DesignMode == true 则返回 null)。

    或者,如果您是唯一可以处理 AppDomain.CurrentDomain.AssemblyResolve 事件并自己加载虚拟程序集的开发人员。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多