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

Posted

技术标签:

【中文标题】C# - 在项目之间共享资源文件【英文标题】:C# - Sharing resources file between project 【发布时间】:2011-02-25 15:35:34 【问题描述】:

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

所以,继续,我有三个项目:

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

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

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

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

谢谢。


[编辑]

这是我所做的:

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

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

所以在 LinkedProject 目录中我只有:

[目录] bin [目录] obj [文件] 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 将资源添加为链接 清理所有解决方案 重建它

测试!

【问题讨论】:

【参考方案1】:

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

【讨论】:

尝试过的第一件事,不起作用。 (我的另外两个项目已经链接到第一个!) 你说的项目是链接的,到底是什么意思? 使用那个“被黑”的项目文件,你只包括 *.cs 文件。如果您还包含 *.resx 文件,会发生什么情况? @Arnaud F.:我不确定我的评论是否显示在您的收件箱中,这就是我再次给您写信的原因。 @Arnaud F.:命名空间不匹配怎么办?我认为,如果您的链接项目有一个类似LinkedProject 的命名空间,而您的主项目在其项目文件中配置了一个类似MainProject 的命名空间,这将导致错误。【参考方案2】:

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

【讨论】:

尝试过的第一件事,不起作用。 (我的另外两个项目已经链接到第一个!)【参考方案3】:

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

或者没有。

您可以在运行时获取根命名空间,在 *Resources.designer.cs 文件中。请注意 cmets 中指向相关答案的链接。确保你提交并密切关注它,代码生成器有覆盖它的习惯,这会破坏它的普遍性。我使用 xml doc cmets 来提醒我发生了什么,如果代码生成将其删除,我将在提交差异中看到它。

/// <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://***.com/a/1329631/492 https://***.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;
    

【讨论】:

感谢9岁的回复;)

以上是关于C# - 在项目之间共享资源文件的主要内容,如果未能解决你的问题,请参考以下文章

C# 怎样实现两个窗体之间的数据共享?

C#项目中如何调用C#写的dll中的资源文件,如 xml文件

c# 通过内存映射实现文件共享内存

C# 在共享项目中使用引用/类库

为啥 C# 和 VB 项目有不同的清单资源结构?

C# WPF 项目启动真找不到资源 图片文件