【发布时间】: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