如何检查我的 C# 应用程序是不是使用来自 nuget 包的正确平台特定 dll?

Posted

技术标签:

【中文标题】如何检查我的 C# 应用程序是不是使用来自 nuget 包的正确平台特定 dll?【英文标题】:How to check if my C# app is using the right platform specific dll from nuget package?如何检查我的 C# 应用程序是否使用来自 nuget 包的正确平台特定 dll? 【发布时间】:2019-04-09 10:52:25 【问题描述】:

我正忙于添加对多个 .net 框架和平台的支持。不同的框架似乎工作。但是,如果使用了正确的平台特定 dll,我真的不知道如何检查这一点。现在好像总是使用MSIL/Any CPU版本……

首先是 nuget 包

我按照以下说明操作:

https://docs.microsoft.com/en-us/nuget/create-packages/supporting-multiple-target-frameworks

我也在使用 .targets 和 .props 文件。

查看 Pullrequest 开源项目的代码:https://github.com/lucascebertin/Serilog.Sinks.Burst/pull/1

使用 nuget 包

使用 Nuget 包时,一切似乎都正常。但目前我做了 2 次检查以查看是否使用了正确的平台 dll。 注意:平台选择是 MSIL/Any CPU、x86 和 x64。

我在我的包中的 dll 和使用项目的 bin 文件夹中提取/复制的 dll 之间进行了比较:看起来 MSIL/Any CPU dll 版本被复制了。

第二个检查是从代码中查看运行时使用了哪个dll:

   var oraSinkAsm = Assembly.GetAssembly(typeof(Serilog.Sinks.Burst.Burst<>));
    Console.WriteLine("Using 0 from 1", oraSinkAsm.FullName, oraSinkAsm.CodeBase);
    Console.WriteLine("Location: 0", oraSinkAsm.Location);

结果是:

使用 Serilog.Sinks.Burst,版本=1.0.1.0,文化=中性, PublicKeyToken=null 来自 file:///C:/Develop/Serilog.Sinks.Oracle/src/Serilog.Sinks.Oracle/Serilog.Sinks.Oracle.ConsoleTester/bin/x64/Release/net452/Serilog.Sinks.Burst.DLL 地点: C:\Develop\Serilog.Sinks.Oracle\src\Serilog.Sinks.Oracle\Serilog.Sinks.Oracle.ConsoleTester\bin\x64\Release\net452\Serilog.Sinks.Burst.dll

所以上面的 bin\x64\Release\net452\Serilog.Sinks.Burst.dll 看起来是 MSIL 版本:

我的 dist\build 文件夹中的原始构建版本是:

所以它们应该是相同的,但不同的状态:I386 vs. AMD64???

我的问题:

运行时 C# 是否或可以使用编译时以外的其他 dll? 以上检查是否足够,或者我还需要其他检查吗? 真的需要构建所有平台风格还是 MSIL/Any CPU dll 就足够了?

【问题讨论】:

您的包是否包含任何特定于本机架构的程序集?如果没有,您无需费心在包中包含任何运行时文件夹。 感谢您的意见!所有程序集都是托管代码,但针对不同的平台目标构建。我需要这个来提高性能和/或效率吗? 如果你问,你很可能不会。最常见的做法是在发布模式下针对 Any CPU 进行构建。 【参考方案1】:

通常不需要在包中包含任何特定于体系结构的文件夹,除非它包含任何专门针对 ARM、x86 或 x64 的程序集。这通常仅适用于您的 C# 代码可能包装的本机(非 .NET)程序集。

如果您的包仅包含托管程序集,最常见的做法是在发布模式下针对 Any CPU 进行构建。

【讨论】:

以上是关于如何检查我的 C# 应用程序是不是使用来自 nuget 包的正确平台特定 dll?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C# 或 Javascript 检查文件是不是存在?

如何在C#中检查我的互联网是不是超时[重复]

如何检查系统上是不是存在电池,然后在 C# 中为我的 WPF 应用程序获取电池百分比

如何检查 Json 是不是匹配特定的 C# 类型?

如何从文本框(windows窗体)检查主键是不是存在于我的数据库中,c#

C#如何检查事件是不是异步执行