如何在一个解决方案中的多个项目之间使用共享资源文件?

25

我有一个关于资源文件的问题。

我有两个项目的解决方案。第一个项目中包含ImageResource.resx文件和我使用的图片。每个在这个项目中的Form都可以从设计器中访问此文件。但是我无法在设计器中看到ImageResource.resx文件,以便从第二个项目中使用(有对第二个项目的引用)。

我已将ImageResource.resx文件作为链接添加到我的第二个项目中。然后我在设计器中看到它!但是当我在第二个项目中使用此资源中的图像时,Visual Studio会修改我的原始文件(它设置了命名空间等),导致我的解决方案崩溃。此外,Visual Studio告诉我ImageResource.resx存在于两个dll中:first_project.dllsecond_project.dll

有人能帮我如何正确地在项目之间共享资源?

5个回答

42
  1. 正确的资源共享方式是创建一个全局共享项目。使用名称为资源创建一个新项目:

显示一个示例解决方案的Solution Explorer,其中包含名为 *Resources* 的项目

  1. 接下来我们必须向项目中添加一些资源(如图标)。按照惯例进行操作。转到项目设置,选择选项卡资源,并将现有文件添加到项目中。我们可以看到该图标已添加到该项目中并被复制到本地文件夹:

例如,Resources项目的资源选项卡显示一张小狗的图片,而解决方案浏览器显示Resources项目的资源文件夹包括小狗的图片

  1. 下一步是将此图标添加到其他项目中。请注意重要的区别,您需要将此图标添加为链接

    以链接的方式添加可避免资源重复。在同一解决方案中创建一个新项目,并将其命名为。在此新项目中创建一个文件夹,将其命名为资源(对于我们的目的来说是逻辑名称)。然后右键单击此文件夹,选择添加现有项…并从共享项目文件夹中选择图像文件。确保在此处使用添加为链接!如果操作正确,则新添加的文件的图标将略有不同(如下所示):

在“添加现有项”对话框中,从“添加”按钮的下拉列表中选择“添加为链接”选项

已添加资源的图标应如下所示:

在解决方案资源管理器中,主项目的小狗资源图标上有一个箭头,而资源项目的小狗资源图标上没有箭头

  1. 现在我们必须将此文件的“生成操作”设置为。选择该文件并转到 属性 窗口。在那里为 生成操作 选择 。我们需要这样做以避免将此图标嵌入程序集:

在解决方案资源管理器中更改*Main* 项目的小狗资源的属性。选择生成操作为 *无*

  1. 最后,我们需要将链接的文件添加到相应项目的 资源 中。打开刚刚添加文件的项目的 属性。选择 资源 标签,并将链接的文件拖到那里:

将链接的图片从解决方案资源管理器的 *Main* 项目资源拖放到 *Main* 项目资源选项卡的查看窗格中

这是您必须执行的五个简单步骤来共享项目之间的图标。您可能会问:“这有什么好处?”其好处是:

  • 我们将资源存储在一个地方,
  • 更换图标非常容易。

这个答案似乎缺少一些文本? - BlueRaja - Danny Pflughoeft
1
请允许我问一下,“这有什么好处呢?” :-) - Nicolas Raoul
5
我们把资源存储在一个地方,这样很容易用新的图标替换掉旧的。 - Yuriy

3
这种方法对我不起作用,我找到了另一种(VS2015+)方法。简而言之,共享项目直接包含在外围项目中。因此,即使IDE不支持共享项目中的<Resource>元素,可以通过文本编辑器向共享项目添加<Resource>元素。然后在构建过程中,它们将被合并到外围项目中。请参阅https://dev59.com/L3NA5IYBdhLWcg3wEpkU#45471284获取更多详情。很抱歉提供超链接。为了清晰明了,我想重新发布答案,但stackoverflow编辑人员会删除重复的答案以避免 ???.

你遇到了什么问题?(指的是第一句话) - StayOnTarget
@StayOnTarget,当时的二进制资源,如图标和图形图像,在项目之间没有 UI 支持共享。 但是,通过一点文本编辑和缺乏目录支持,二进制资源可以共享! - ergohack

1
你能使用符号链接将文件共享到多个文件夹中吗?
Windows:
mklink linked_location\ImageResource.resx original_location\ImageResource.resx


C:\Users\preet>mklink
Creates a symbolic link.

MKLINK [[/D] | [/H] | [/J]] Link Target

        /D      Creates a directory symbolic link.  Default is a file
                symbolic link.
        /H      Creates a hard link instead of a symbolic link.
        /J      Creates a Directory Junction.
        Link    specifies the new symbolic link name.
        Target  specifies the path (relative or absolute) that the new link
                refers to.

1
如果一个资源文件在多个项目之间共享,那么应该将它放置在一个共享项目中。
Solution 'Sample'
   Project Sample.Data
   Project Sample.Business
   Project Sample.UI
   Project Sample.Resource   //shared resources are put in a shared project  

项目的结构和你说的一样。问题是我在设计器中看不到Project Sample.Resource.ImageResource.resxProject Sample.UI中。我必须进入myForm.designer.cs并手动输入button.Image = Sample.Resource.ImageResource.SomeImage。稍后,当VS重建myForm.designer.cs时,我为按钮键入图像的行将是button.Image = ((System.Drawing.Image)(resources.GetObject("SomeImage.Image")));,而VS会自动将ImageResource.resx文件中的SomeImage插入(复制)到特定表单的资源文件中.. :( - Yuriy
@Yuriy:链接失效了(可能是因为我在中国,一些网站被政府屏蔽了)。关于我的回答,我认为你的某些选项设置不正确(但抱歉我不记得更多有关设置的细节),我曾经参与过一个项目,它像你的解决方案一样在几个项目之间共享资源。我们程序员使用我在回答中提到的这种方式,它确实有效。 - Cheng Chen

0

如果资源不是公共的,而且默认设置为“Friend”,则无法查看该资源。您可以在可视化设计器中(右上角)设置“访问修饰符”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接