Visual studio 如何让Windows窗体设计器使用来自外部程序集的资源?

Visual studio 如何让Windows窗体设计器使用来自外部程序集的资源?,visual-studio,winforms,resources,windows-forms-designer,Visual Studio,Winforms,Resources,Windows Forms Designer,我在Windows窗体项目的控件上使用的资源文件中有一些资源(本例中为图像)。VisualStudio资源选择对话框对于从资源文件中选择图像没有很好的支持,除非它们位于特定的位置,但是您可以直接编辑设计器文件,而且效果很好;应用程序可以正确编译和运行,Windows窗体设计器足够聪明,不会弄乱我手工编辑的代码 // in an assembly named ResourceConsumer this.button1.Image = global::ResourceConsumer.Propert

我在Windows窗体项目的控件上使用的资源文件中有一些资源(本例中为图像)。VisualStudio资源选择对话框对于从资源文件中选择图像没有很好的支持,除非它们位于特定的位置,但是您可以直接编辑设计器文件,而且效果很好;应用程序可以正确编译和运行,Windows窗体设计器足够聪明,不会弄乱我手工编辑的代码

// in an assembly named ResourceConsumer
this.button1.Image = global::ResourceConsumer.Properties.Resources.Close32x32;
现在,我想将这些资源移动到外部程序集,以便多个应用程序可以使用它们。我可以设置一个程序集来毫无问题地公开其资源(只要我使用的是VisualStudio2008或更高版本),这样就可以了。当我更改设计器代码以从其新位置引用图像时,代码会正确编译和运行,但现在Windows窗体设计器在生成代码时会更改我的代码;它将图像的二进制文件嵌入到本地资源文件中,并从那里引用它

// ResourceProducer is an external assembly containing resources
this.button1.Image = global::ResourceProducer.Properties.Resources.Exit32x32;
由Windows窗体设计器更改为:

this.button1.Image = ((System.Drawing.Image)(resources.GetObject("button1.Image")));

Windows窗体设计器似乎理解从同一程序集中提取资源,而不是从外部提取资源。有没有办法让Windows窗体设计器允许我使用来自外部程序集的资源?

没有,设计器不支持此操作。重要的是,它的工作方式是这样的,否则通过卫星组件进行本地化将无法工作

您可以这样做,但您必须自己编写代码。与Resources.Designer.cs文件中的内容非常相似。请考虑如果这是值得的努力,它不是很可维护和共享资源组件不是一个优化。一个TB的磁盘不到一百美元

顺便说一句:千万不要自己编辑Resources.Designer.cs文件。

我有确切的方法,根据您的代码库,可能还有其他方法。如果已修改以引用特定资源的属性位于自定义控件上,则可以将
[[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
属性添加到这些属性(如有必要,可以覆盖或隐藏它们),而设计器将不处理它们


但是,如果属性是在基本UI元素(例如Form.BackgroundImage)上,那么您也必须覆盖或隐藏这些元素,我不确定这有多可取。

事实上,我无法找到任何方法使设计师支持这一点,但您说的是什么意思“通过卫星组件进行本地化不起作用?"我们希望整合资源以减少代码重复和本地化工作;一次包含和本地化一个资源比在每个需要它的项目中都更容易。在这种情况下,本地化的资源不是基于资源程序集的附属程序集进行检索吗?如果是这样,我们仍然可以使用资源库不需要设计器支持的项目的e程序集。