如何从 Web 项目引用的 .NET 程序集中获取属性?

How do I get attributes from a .NET assembly that's referenced by a web project?

我在 vb.NET (4.6.2)、ASP.NET 和 VIsual Studio 2015 年工作。

这个问题不是关于如何从程序集中加载属性的。我的示例代码演示了这一点。

我有一个 Web 应用程序 ("foo"),它在同一解决方案 ("bar.dll") 中引用了一个 DLL 项目。

Web 应用程序包含一个 "AssemblyVersionInfo.vb" 文件,该文件引用普通:

Imports System.Reflection
<Assembly: AssemblyProduct("Foo Product")> 
<Assembly: AssemblyCompany("Foo Company")>
<Assembly: AssemblyCopyright("&copy; Foo, Inc.")>
<Assembly: AssemblyTrademark("")>
<Assembly: AssemblyFileVersion("18.02.00")>
<Assembly: AssemblyVersion("18.02.00")>

Bar.DLL 项目需要访问版本信息,并尝试这样调用它:

Dim asmbly As [Assembly] = [Assembly].GetExecutingAssembly
Dim tnProduct As AssemblyProductAttribute = System.Attribute.GetCustomAttribute(asmbly, GetType(AssemblyProductAttribute))
Dim tnCompany As AssemblyCompanyAttribute = System.Attribute.GetCustomAttribute(asmbly, GetType(AssemblyCompanyAttribute))
Dim tnCW As AssemblyCopyrightAttribute = System.Attribute.GetCustomAttribute(asmbly, GetType(AssemblyCopyrightAttribute))
Dim tnVersion As AssemblyFileVersionAttribute = System.Attribute.GetCustomAttribute(asmbly, GetType(AssemblyFileVersionAttribute))

Me.AppName = tnProduct.Product
Me.AppVersion = tnVersion.Version
Me.Copyright = tnCW.Copyright
Me.Company = tnCompany.Company

这是我的问题:在运行时,"Me.AppName" 行抛出 "Object reference not set" 异常。在调试中单步执行显示 tnProduct、tnVersion、tnCW 和 tnCompany 对象都是 Nothing。

所以,我认为 bar.dll 项目需要自己的 AssemblyVersionInfo.vb 文件。我将 AssemblyVersionInfo.vb 文件的副本从 Web 项目添加到 bar.dll 项目(既作为常规文件又作为 link),只是遇到了一些编译错误:

Attribute 'AssemblyCompanyAttribute' cannot be applied multiple times'

...每个属性依此类推。

在解决方案中包含 AssemblyVersionInfo.vb 文件以使其属性对所有程序集可见的正确方法是什么?有什么明显的地方我做错了吗?

如果您收到此错误,则表示这已在另一个文件中指定。我不知道为什么,但是在 VB 中,这个文件对开发人员是隐藏的。在 C# 中,它位于属性中,名为 AssemblyInfo.cs.

您可以从 Bar 项目的 Properties->Application->Assembly information 页面访问它并在那里编辑它并将值设置为空字符串,但您将无法从中完全删除整个属性那里。

所以你应该做的是搜索AssemblyProduct。它应该在两个项目中找到。然后双击 Bar 项目中找到的一项。现在它应该打开 .vb 文件,您可以在其中看到这些属性并删除它们。

或者您可以只转到磁盘上的文件,在 My Project 文件夹中应该有一个声明了这些属性的文件。

之后,您可以轻松地将文件添加为 link 或正常添加。

像这样: