gpt4 book ai didi

c# - 在网站中使用反射访问 AssemblyInfo.cs 中的信息

转载 作者:行者123 更新时间:2023-11-30 15:50:17 24 4
gpt4 key购买 nike

我已经创建了一个 DLL,它将从 AssemblyInfo.cs 中收集信息。在类构造函数中,我使用反射来获取正在运行的最顶层应用程序。

public class AppInfo()
{
public AppInfo()
{
System.Reflection.Assembly assembly =
System.Reflection.Assembly.GetEntryAssembly();
if (assembly == null)
assembly = System.Reflection.Assembly.GetCallingAssembly();


//code to gather needed information
}
}

如果我从给定应用程序 MyApp 中的任何 DLL 调用它,那么它的用途是这样的,假设名称将始终为“MyApp”。检索该信息不是问题,它在 Windows 服务和 Windows 应用程序中运行良好。我的问题是:如何获取最顶层网站的程序集?

我找到了几篇文章,我可以通过将网站的 AssemblyInfo.cs 从 App_Code 文件夹移到网站的根目录中来获取 Global.asax.cs 中的信息。然后通过在 AssemblyInfo.cs 的物理路径中添加一个 compilerOption

<compiler
language="c#;cs;csharp"
extension=".cs"
compilerOptions="C:\Sandbox\MyWebSite\AssemblyInfo.cs"
type="Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">

使用它,我能够通过 System.Reflection.Assembly.GetExecutingAssembly() 检索网站的 AssemblyInfo.cs 中的信息。现在我可以重载我的 AppInfo 类的构造函数以接受 Assembly 并以这种方式检索信息,但是如果 MyWebSite 使用另一个 DLL创建一个 new AppInfo() 我将获取该 DLL 而不是父网站的程序集信息。

我知道,如果我使用 Web 应用程序而不是网站,我就不会遇到这个问题,但由于我不会深入探讨的原因,我无法使用 Web 应用程序。关于如何从我正在运行的网站的 AssemblyInfo.cs 中读取信息的任何建议,无论我在哪个 DLL 中?

编辑:我需要它来为网站、Windows 应用程序和 Windows 服务工作

最佳答案

如果我理解正确,问题是 Assembly.GetEntryAssembly() 在网站中返回 null 而 Assembly.GetCallingAssembly() 返回错误的东西,因为你有一连串的调用导致网站不是直接调用者。如果是这种情况,您可以使用堆栈跟踪找到“入口程序集”并返回调用框架。堆栈将充满来自 System.Web 等的引用,因为调用将起源于 IIS 深处的某处,但您应该能够通过捕获您可以肯定识别的最低帧来挑选您感兴趣的程序集作为属于你。请注意,这很老套,但我认为它会满足您的需求...

var trace = new StackTrace();
Assembly entryAssembly = null;
foreach (var frame in trace.GetFrames())
{
var assembly = frame.GetMethod().DeclaringType.Assembly;
//check if the assembly is one you own & therefore could be your logical
//"entry assembly". You could do this by checking the prefix of the
//Assembly Name if you use some standardised naming convention, or perhaps
//looking at the AssemblyCompanyAttribute, etc
if ("assembly is one of mine")
{
entryAssembly = assembly;
}
}

希望其他人能够想出一个不那么讨厌的方法...但如果您真的遇到困难,这可能会有所帮助。

关于c# - 在网站中使用反射访问 AssemblyInfo.cs 中的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/758077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com