【问题标题】:Dot Net Core being Inconsistent点网核心不一致
【发布时间】:2019-11-14 09:23:58
【问题描述】:

我的应用程序中有一个问题,当在程序集 Sigil v4.7 上调用 GetCustomAttributes 时,它会引发异常。

但这仅在特定情况下发生。如果通过 Jil v2.15.4 添加 Sigil v4.7,那么它就会发生。

如果您直接添加 Sigil v4.7,它不会重现。同样,如果您添加最新版本的 Jil (v2.17.0),它仍然引用 Sigil v4.7,它不会重现。

我很困惑,为什么给定相同的 dll,我会得到不同的结果。

这是我的测试代码:

using System.Diagnostics;
using System.Linq;
using System.Reflection;

namespace WindowsAssemblyTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var sigilAssembly = AppDomain.CurrentDomain.GetAssemblies()
                                         .FirstOrDefault(x => x.FullName.Contains("Sigil"));

            try
            {
                var attrs = sigilAssembly?.GetCustomAttributes(typeof(AssemblyProductAttribute), false)
                                          .OfType<AssemblyProductAttribute>();

                Debug.WriteLine(">>>>>>  Success: " + sigilAssembly?.GetName());
            }
            catch (System.IO.FileNotFoundException exception)
            {
                Debug.WriteLine(">>>>>>  Failed: " + sigilAssembly?.GetName() + " with " + exception.Message);
            }

            // This is here so the compiler does not remove the reference to Sigil.
            var createReferenceToSigil = Sigil.OptimizationOptions.All;    
        }
    }
}

要重现此问题,请创建一个 .net 核心控制台应用并将上述代码添加到 program.cs。然后添加对 Jil v2.15.4 的 NuGet 引用并运行。调试窗口将显示:

>>>>>> 失败:Sigil,版本=4.7.0.0,Culture=neutral,PublicKeyToken=2d06c3494341c8ab 无法加载文件或程序集“System.Runtime.InteropServices.PInvoke,版本=4.0.0.0,Culture=中立,PublicKeyToken=b03f5f7f11d50a3a'。系统找不到指定的文件。

如果您随后升级到 Jil v2.17.0,您将看到:

>>>>>> 成功:印记,版本=4.7.0.0,文化=中性,PublicKeyToken=2d06c3494341c8ab

为什么相同版本的 dll Sigil 会在一个版本的 Jil 上失败,而在另一个版本上失败?

【问题讨论】:

  • 可能是 Windows 文件夹权限搞砸了?它不时这样做,并进行更新。最极端的情况之一是我的 Firefox 无法访问它的自己的配置文件目录,而某些东西弄乱了该文件夹的权限。将我的整个使用配置文件权限简单地重置为“此用户和管理员,一切”修复它。
  • @john - 找到程序集。它只是在尝试对其调用 GetCustomAttributes 时失败。
  • @Christopher - 我认为这不是权利,因为我可以两次访问它。只有一个给出了 PInvoke 缺失异常,而另一个没有。
  • 您是否比较了每个版本的依赖项列表?很有可能 15 只是没有包含任何将“System.Runtime.InteropServices.PInvoke”作为依赖项的内容,并且您拥有的任何其他包或主项目都没有将其引入......

标签: c# nuget .net-core-3.0


【解决方案1】:

我认为问题与印记无关。正如您在评论中提到的,它发现 Sigil 很好,但在 GetCustomAttributes 上失败了。

这就是问题所在:GetCustomAttributes 依赖于 System.Runtime.InteropServices.PInvoke

那么,当您使用 Jil v2.17.0 而不是 v2.15.4 时,为什么它可以找到 PInvoke

查看Jil v2.17.0Jil v2.15.4 的依赖关系。不同的是2.17.0支持.NETStandard 2.0,而v2.15.4只支持.NETStandard 1.6。

很难找到确切的问题,但如果您搜索 "System.Runtime.InteropServices.PInvoke" "GetCustomAttributes",您会发现几个结果说明 System.Runtime.InteropServices.PInvoke 在 .NET Core 1.0 中不可用。 (它在候选版本中,但removed before release

所以我相信,如果您使用较新的包,它会在 .NETStandard 2.0 下运行,并且PInvoke 可用。

【讨论】:

    猜你喜欢
    • 2017-03-22
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 2018-05-11
    相关资源
    最近更新 更多