繁体   English   中英

如何以编程方式获取解决方案中使用的 NuGet package 的版本?

[英]How can I programatically get the version of a NuGet package being used in the solution?

我正在做一个项目,我们需要知道我们正在使用的一个 NuGet package 的版本,并在代码中使用它。

我尝试的一种方法是从packages.config文件中读取,将其解析为我想要的 package,然后解析版本行。 就像是:

var lines = System.IO.File.ReadAllLines(@"..\..\packages.config");
foreach(var line in lines)
{
    if (line.Contains("My.Package"))
    {
         foreach(var part in line.split(' '))
         {
             if (part.Contains("version"))
             {
                 return part.Split('"')[1];
             }
         }
    }
}

有没有更好的方法以编程方式执行此操作?

注意:上面的代码将不起作用,因为packages.config没有随应用程序一起部署。

如果包有任何类,您可以从该类获取程序集,然后获取版本。 但是,如果包没有类,例如使用 nuget.targets 复制文件,那么这种方式是不可能的。

Console.WriteLine("Using Selenium.WebDriver: " + Assembly.GetAssembly(typeof(OpenQA.Selenium.By)).GetName().Version.ToString());

好问题。 但是你还没有说你为什么想知道版本。

我必须从指出你走错路开始我的回答。 我怀疑您需要在运行时知道正在使用的程序集版本。

但是整个 NuGet 概念和packages.config是一个编译时概念而不是运行时概念。 您甚至不应该在输出文件夹或已发布文件夹中包含packages.config 在运行时,您需要从AppDomain.CurrentDomain获取加载的程序集。 我不会在这里深入讨论它,但这里是您可以查看的参考 我只说你可以在那里获得汇编版本。

然后,在代码中,如果您想根据某些程序集版本做不同的事情。 如果您想根据框架或程序集的版本进行编译 - 请查看这篇文章

底线:

packages.config 存在与否,或其中包含什么,与编译时使用了哪个 DLL 文件无关。 VS 具有令人难以置信的能力,可以在目录中爬行并找到匹配的 DLL 文件。 packages.config可能已过时或与实际 dll 不同步。 这不是一种万无一失的做事方式。

您可以从程序集中读取版本:

string assemblyVersion = Assembly.LoadFile('your assembly file').GetName().Version.ToString();

您可以将项目配置为在编译时记录数据。 下面是一个 MSBuild 片段,它生成一个名为MyNamespace.MSBuildVersionAttribute的程序集属性,带有一个构造函数参数。

<Target Name="ExtractMSBuildVersion" BeforeTargets="BeforeBuild">
    <ItemGroup>
        <MSBuildPackageVersion Include="@(PackageReference->'%(Version)')" Condition="'%(Identity)' == 'Microsoft.Build'" />
        <AssemblyAttributes Include="MyNamespace.MSBuildVersionAttribute">
            <_Parameter1>@(MSBuildPackageVersion)</_Parameter1>
        </AssemblyAttributes>
    </ItemGroup>
        
    <WriteCodeFragment AssemblyAttributes="@(AssemblyAttributes)" Language="C#" OutputDirectory="$(IntermediateOutputPath)" OutputFile="MSBuildVersion.cs">
        <Output TaskParameter="OutputFile" ItemName="Compile" />
        <Output TaskParameter="OutputFile" ItemName="FileWrites" />
    </WriteCodeFragment>
</Target>

您现在可以在运行时访问该属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM