C# - 在项目之间共享资源文件

时间:2011-02-25 15:35:35

标签: c# resources

我想两个如何在两个(或更多)项目之间共享资源文件?

所以,为了恢复,我有三个项目:

包含资源文件(包含所有定义)的开发项目(CF.NET)。

我还有两个空的项目但是链接到开发项目,每次只是一个不同的构建,所以当我修改开发项目时,所有三个项目也都会更新。 (修改csproj文件。)

问题是,资源文件怎么样?当我尝试从开发项目访问时,我获得了所有资源,但是当我从其他2个人那里尝试时,它会抛出“MissingManifestResourceException”。

知道如何解决这个问题吗?

感谢。


[编辑]

以下是我所做的:

创建一个名为“RealProject”的项目,其中包含所有代码(包括资源文件) 创建一个名为“LinkedProject”的项目,其中不包含任何内容(我删除了所有文件并修改了csproj文件,如下所示:

  <ItemGroup>
    <Compile Include="..\RealProject\**\*.cs" />
  </ItemGroup>

所以在LinkedProject目录中我只有:

  • [目录] bin
  • [目录] obj
  • [File] LinkedProject.csproj

整个LinkedProject使用RealProject文件,它只是一个不同的配置版本(请参阅此处了解原因:C# - Code compiler for .NET & CF.NET

进入该配置后,我无法访问RealProject中的资源文件...

如果您需要屏幕或更详细的说明,请询问。


[编辑]

使用此代码,它可以工作,资源管理器没有加载好的程序集名称,但它应该存在更好的解决方案!!!

Assembly ass = Assembly.ReflectionOnlyLoadFrom(@"..\..\..\RealProject\bin\Debug\RealProject.dll");
ResourceManager manager = new ResourceManager("RealProject.Properties.Resources", ass);

[解决]

要检查的事项:

  • LinkedProject同样如此 名称空间为RealProject
  • 将资源添加为链接
  • 清理所有解决方案
  • 重建

测试!

3 个答案:

答案 0 :(得分:7)

尝试将资源文件 as a link 添加到其他两个项目中,并确保项目文件中定义的名称空间相同。

答案 1 :(得分:1)

尝试将其他项目中的现有文件添加为链接。

答案 2 :(得分:0)

在不同项目之间共享资源文件的问题在于,在其中使用相同文件的所有项目中,根名称空间必须相同。

还是不。

您可以在运行时获取*Resources.designer.cs文件中的根名称空间。请注意评论中指向相关答案的链接。确保提交并关注它,代码生成器有重写它的习惯,这会破坏其通用性。我使用了xml doc注释来提醒我发生了什么,如果代码源清除了该代码,我将在commit diff中看到它。

/// <summary> Returns the cached ResourceManager instance used by this class.  </summary>
/// <remarks> DO NOT commit any version of this file the tool overwrites, it will break it for other projects</remarks>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Resources.ResourceManager ResourceManager {
    get {
        if (object.ReferenceEquals(resourceMan, null)) 
        {
            // https://stackoverflow.com/a/1329631/492 https://stackoverflow.com/a/51978052/492  
            Assembly thisAssembly = typeof(/*thisClassName*/).Assembly;
            // you need a class called "App", or just change the name on the next line to one you have in the root namespace
            var apps = thisAssembly?.GetTypes().Where(t => t.Name == "App");

            if (apps.Count() != 1)
                throw new InvalidOperationException($"Too Many App classes. Count: {apps.Count()}, Apps: {apps}");
            
            Type appType = apps.FirstOrDefault();
            string ns = appType.Namespace;
            global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager($"{ns}.OtherNames.Spaces.thisClassName", typeof(thisClassName).Assembly);
            resourceMan = temp;
        }
        return resourceMan;
    }
}