【问题标题】:ProjectGuid (.csproj), how to generate it correctly?ProjectGuid (.csproj),如何正确生成?
【发布时间】:2015-07-02 14:43:09
【问题描述】:

我正在创建一个应用程序。要更改多个项目的名称空间(解决方案),我将内容复制到另一个位置,更改文件夹名称,替换文件内容中的文本(旧名称空间与新名称空间),一切正常。解决方案有文件夹(这些文件夹仅存在于解决方案中,在 VS 中),每个文件夹都包含项目和文件...这是原始(或模板)解决方案的结构:

    MySolution
    |
    |---SolutionFolder1
    |           |
    |           |-- Documentation.docx
    |
    |---SolutionFolder2
    |           |
    |           |-- ThirdPartyLibrary.dll
    |
    |---SolutionFolder3
    |           |
    |           |-- MySolution.MyLibrary(**Project**)
    |                     |
    |                     |-- Class.cs
    |
    |---SolutionFolder4
    |           |
    |           |-- MySolution.MyConsoleApp(**Project**)
    |                     |
    |                     |-- Program.cs
    |

我只将整个解决方案复制到另一个地方,甚至在 .csproj 和 .sln 文件中更改了一些名称。如果我打开新的解决方案都出现在它的位置(如上面的结构),解决方案文件夹中的项目和解决方案编译,一切正常。 但是,如果我在打开新解决方案时更改每个项目的 ProjectGuid,我会得到以下结构:

    MySolution
    |
    |---SolutionFolder1
    |           |
    |           |-- Documentation.docx
    |
    |---SolutionFolder2
    |           |
    |           |-- ThirdPartyLibrary.dll
    |
    |---SolutionFolder3          
    |
    |---SolutionFolder4
    |
    |
    |-- MySolution.MyLibrary(**Project**)
    |           |
    |           |-- Class.cs
    |
    |-- MySolution.MyConsoleApp(**Project**)
    |           |
    |           |-- Program.cs
    |

如您所见,项目出现在解决方案文件夹之外,尽管其他文件夹维护其内容并编译解决方案。 我使用 Guid.NewGuid() 生成新的 ProjectGuid 并更新其他 .csproj 和 .sln 文件。 这是我的代码(这个方法复制每个文件的内容):

//the projectGuidCollection contains a collection of instances like this:
ProjectGuid proj = new ProjectGuid()
{
    FilePath = @"c:\newpath\to\MyLibrary.csproj",
    OldGuid = "D4BD0EB3-8B59-4A33-B8A3-D549065EEC6D", //<ProjectGuid>{}</ProjectGuid>
    NewGuid = Guid.NewGuid().ToString()
};

public static void Replace(string filePath, string oldNamespace, string newNamespace, 
                           IEnumerable<ProjectGuid> projectGuidCollection)
{
    string text = File.ReadAllText(filePath, Encoding.UTF8);
    text = text.Replace(oldNamespace, newNamespace);

    List<ProjectGuid> allProjectGuids = new List<ProjectGuid>(projectGuidCollection);
    if (filePath.EndsWith(".csproj"))
    {
        ProjectGuid currentProject = allProjectGuids.Find(o => { return o.FilePath.Equals(filePath); });
        if (currentProject != null)
        {
            List<ProjectGuid> otherProjs = allProjectGuids.FindAll(o => { return !o.FilePath.Equals(filePath); });

            //changes current ProjecGuid:
            text = text.Replace(currentProject.OldGuid, currentProject.NewGuid.ToUpper());

            //change other projectguids (references):
            foreach (var refProject in otherProjs)
            {
                text = text.Replace(refProject.OldGuid, refProject.NewGuid);
            }
        }
    }

    //update new projectguids in solution file:
    if (filePath.EndsWith(".sln"))
    {
        foreach (var p in allProjectGuids)
        {
            text = text.Replace(p.OldGuid.ToUpper(), p.NewGuid.ToUpper());
        }
    }

    File.WriteAllText(filePath, text,Encoding.UTF8);
}

我需要你的帮助。

【问题讨论】:

    标签: c# visual-studio msbuild guid projects-and-solutions


    【解决方案1】:

    在我花了很多时间搜索信息之后,我终于在@MarkLakata 的评论中找到了解决方案here

    如果您想与一些无法理解小写 UUID 的 MS Build 工具兼容,您可能需要使用 System.Guid.NewGuid().ToString("B").ToUpper()。例如,vdproj 设置项目的 UUID 为大写,如果您将其设为小写,则会引发异常。 -

    所以解决办法是:

    //the projectGuidCollection contains a collection of instances like this:
    ProjectGuid proj = new ProjectGuid()
    {
        FilePath = @"c:\newpath\to\MyLibrary.csproj",
        OldGuid = "D4BD0EB3-8B59-4A33-B8A3-D549065EEC6D", //<ProjectGuid>{}</ProjectGuid>
        NewGuid = Guid.NewGuid().ToString("B") // <--- HERE THE SOLUTION!!
    };
    

    嗯,就是这样。

    【讨论】:

    • 你的代码不应该是NewGuid = Guid.NewGuid().ToString("B").ToUpper()吗?不是NewGuid = Guid.NewGuid().ToString("B")?
    • 谢谢,要在powershell中快速生成,只需运行[System.Guid]::NewGuid().ToString("B").ToUpper()
    猜你喜欢
    • 2020-08-21
    • 2020-01-08
    • 2018-08-20
    • 2019-05-26
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多