我最近遇到了同样的问题。查看了 MS 文档,但找不到任何好的解决方案。我最终能够使用下面描述的方法让 WinForms 设计器中的图像编辑器识别来自其他项目的资源文件。这很 hacky - 如果有人想分享更清洁的解决方案,请发布。我仅在 VS 2008 上对此进行了测试。
在开始之前,我应该说,如果您只是想让 Resources.resx 文件中的项目可供其他项目访问,您只需编辑其属性并将生成的类的访问修饰符设置为 public,以便它使用 PublicResXFileCodeGenerator。仅当您想让 WinForms 设计人员按照上述 Douglas 的帖子中所述在此资源文件中拾取图像时,才需要下面的操作。
假设您的解决方案具有以下布局。各种项目的默认命名空间(在解决方案资源管理器中右键单击项目节点 -> 属性 -> 应用程序选项卡)在这里很重要,因此我将其放在项目名称后面的括号中。
- 我的解决方案
- SharedProject(默认命名空间 = SharedProject)
- WinFormsProject1(默认命名空间 = WinFormsProject1)
- WinFormsProject2(默认命名空间 = WinFormsProject2)
您想在SharedProject中创建一个资源文件,其中包含WinFormsProject1和WinFormsProject2可以使用的图像。
首先在SharedProject的根目录下新建一个 Resource 文件,我们称之为SharedResources.resx。此文件使用 ResXFileCodeGenerator 而不是 PublicResXFileCodeGenerator 很重要,原因稍后会清楚。
在 Visual Studio 中编辑SharedResources.resx并添加要共享的图像资源。Visual Studio 还应该在SharedProject中为您生成一个名为SharedResources.designer.cs的类文件。
您的解决方案现在应该如下所示:
- 我的解决方案
- SharedProject(默认命名空间 = SharedProject)
- SharedProject.csproj
- 共享资源.resx
- SharedResources.Designer.cs
- WinFormsProject1(默认命名空间 = WinFormsProject1)
- WinFormsProject2(默认命名空间 = WinFormsProject2)
如果您使用文本编辑器打开SharedProject.csproj,您应该会看到以下条目:
<EmbeddedResource Include="SharedResources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>SharedResources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<Compile Include="SharedResources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>SharedResources.resx</DependentUpon>
</Compile>
现在您需要使 WinFormsProject1 中的资源可访问。为此,您需要在文本编辑器中编辑WinFormsProject1.csproj,因为您需要设置的某些属性未在 Visual Studio 中公开。
打开WinFormsProject1.csproj文件并在 ItemGroup 中添加以下内容:
<Compile Include="..\SharedProject\SharedResources.Designer.cs">
<Link>SharedResources.Designer.cs</Link>
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>SharedResources.resx</DependentUpon>
</Compile>
<EmbeddedResource Include="..\SharedProject\SharedResources.resx">
<Link>SharedResources.resx</Link>
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>SharedResources.Designer.cs</LastGenOutput>
<CustomToolNamespace>SharedProject</CustomToolNamespace>
<LogicalName>SharedProject.SharedResources.resources</LogicalName>
</EmbeddedResource>
这里的关键是CustomToolNamespace和LogicalName。默认情况下,Visual Studio 使用项目的默认命名空间来命名资源并生成 *.Designer.cs 文件。由于SharedProject和WinFormsProject1具有不同的默认命名空间,默认行为会导致WinFormsProject1中嵌入的资源与SharedProject中的 *.Designer.cs 文件不兼容。这可以通过覆盖 CustomToolNamespace 和 LogicalName 来防止。
现在对WinFormsProject2.csproj做同样的事情。返回到 Visual Studio。它会注意到您已更改 csproj 文件并要求重新加载项目 - 选择“重新加载”。您应该会发现,在WinFormsProject1和WinFormsProject2中设计表单时,您现在可以从SharedResources.resx中选择图像。
本质上,所有这一切都是使 VS在WinFormsProject1和WinFormsProject2项目中包含来自SharedProject的SharedResources.resx文件。只有一个 .resx 源文件(在SharedProject中),但是当您编译解决方案时,实际上会有三个相同的类,称为SharedProject.SharedResources,三个程序集中各有一个,但由于它们都具有内部可见性,因此它们不会干扰即使您在项目之间添加引用,也可以相互关联。