GreatLib.dll的供应商部署自定义控件。它正在客户Winforms应用程序中使用。 GreatLib被强烈命名并公开了一些类型。当这些类型在客户表单中用作公共属性时,它们也可以在Windows窗体设计器中使用。这是麻烦开始的地方:
设计人员将在表单的资源文件中为所有类型创建项目,并在这些项目中序列化它们的默认值(?)。由于GreatLib具有强名称,因此引用将包含程序集的完全限定名称。 (我认为这是Resgen的作用吗?)。这些项目可能如下:
<data name="vector3Control1.value" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFRJTE51bWVyaWNzLCBWZXJzaW9uPTQuMi41MzM4LjQ4MDIxLCBD
dWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPThkOWJmNTBlZjg1NDczNGQFAQAAABpJTE51bWVy
aWNzLkRyYXdpbmcuVmVjdG9yMwMAAAADbV94A21feQNtX3oAAAALCwsCAAAAAAAAAAAAAAAAAAAACw==
</value>
</data>
在Form.Designer.cs文件中,设计器生成一些类似于此的代码,以便读入资源项:
this.vector3Control1.value = ((ILNumerics.Drawing.Vector3)(resources.GetObject("vector3Control1.value")));
供应商向GreatLib提供更新,客户使用新版本替换旧版本。但资源文件将保持不变!因此,我们要么在Designer.cs代码上获得InvalidCastExeption,要么 - 如果找不到旧的程序集 - 则为FileNotFoundException。
在resx文件中处理强名称的推荐方法是什么?
使用
完全防止它们[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
?或者手动将每次更新的base64数据转换为suggested by HansPassant?