gpt4 book ai didi

.net - .NET反射问题

转载 作者:行者123 更新时间:2023-12-04 13:25:05 25 4
gpt4 key购买 nike

以下代码(打包在“控制台应用程序” Visual Studio项目中):

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace TestReflection
{
class Program
{
static void Main(string[] args)
{
bool found = false;
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
if (assembly.GetType("System.Diagnostics.Process") != null)
{
found = true;
break;
}
}
Console.WriteLine(found);
Console.ReadKey();
}
}
}

在 Debug模式(F5)下运行时,输出“True”,而在没有调试器的情况下启动时,则输出“False”(Ctrl-F5)。其他类显示类似的行为( System.Text.RegularExpressions.Regex),在两种情况下都发现其他类( System.IO.File)。

我可能缺少明显的东西-为什么会发生这种情况?

(在Visual Studio 2005和2008中都会发生相同的情况)。

更新

找到的程序集列表:

Debug模式:
mscorlib
TestReflection
System
Microsoft.VisualStudio.HostingProcess.Utilities
System.Windows.Forms

运行方式:
mscorlib
TestReflection

正如答案所暗示的,在运行模式下,系统程序集丢失(未加载)。我的问题是我假设GetAssemblies()也返回未加载的程序集。

尽管这解释了 System.Diagnostics.Process的行为,但是为什么我的代码在运行和 Debug模式下都找到了 System.IO.File

谢谢!

更新2

我更改了代码以遍历已加载的程序集和当前程序集,并收集了这些程序集引用的程序集列表。如果在迭代加载的程序集之后找不到所需的类型,那么我将开始加载并检查引用的程序集。

似乎即使我在项目中有对 System.dll的引用(我正在查看Visual Studio中“系统”引用的属性),我的可执行文件也仅引用了 mscorlib.dll(根据Reflector)。

如何为 System.dll添加“真实”引用?放置虚拟线
new System.Diagnostics.ProcessStartInfo();

Main的开头就可以解决问题(事情按预期进行,Reflector在检查可执行文件时会同时显示 mscorlib.dllSystem.dll的引用),但这是一个hack。

再次感谢!

最佳答案

AppDomain.GetAssemblies不返回您引用的所有程序集,而是返回当前已加载到appdomain中的所有程序集。

显然,您的应用程序不会直接使用Diagnostics.Process类,因此在调试器外部运行时将不会加载Diagnostics.Process类。

那么,为什么我们找到System.IO.File但找不到System.Diagnostics.Process?
原因是这两个类尽管位于同一个顶级 namespace System中,但实际上存在于两个不同的程序集中。如果您在Visual Studio对象浏览器中查找两个类,就很容易看出这一点。 File类恰好位于 mscorlib dll中,而Process类则位于系统 dll中。

由于没有mscorlib,.Net应用程序无法运行,因此程序集将被加载,而System.dll将不被加载,因为您没有引用该dll中存在的任何类型。

关于.net - .NET反射问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2139208/

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