在最后查看编辑。
我有一个应用程序需要用户安装第 3 方应用程序才能运行。我想让我的应用程序在用户忘记安装此第 3 方应用程序时向用户发出警告,而不是因为试图访问丢失的程序集而退出。
在 C# 中,我想检查是否包含程序集。
我以为我可以使用:
object.ReferenceEquals(Oject, null)
但是 object.ReferenceEquals 不喜欢将 Type 作为输入。
我试过:
var type = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
from type2 in assembly.GetTypes()
where type2.Name == "Oject"
select type2);
if (type == null) {...}
但是 Visual Studio 告诉我类型永远不能为 null。
那么:有没有一种简单的方法可以检测我是否在访问程序集之前忘记包含程序集(并且应用程序只是在没有警告或消息告诉用户退出原因的情况下退出)?
我以为我可以用
try
{
types = assembly.GetTypes();
}
catch (ReflectionTypeLoadException ex)
{
types = ex.Types.Where(p => p != null).ToArray();
}
来自:Missing types using reflection on DLL但我正在从静态类 Program.cs 中进行这项检查。
编辑: 事实证明,我有引用的程序集,但这些程序集可能没有安装正确的逻辑。因此,引用与所有二进制文件一起出现,但由于未安装第 3 方应用程序,这些二进制文件在无法达到预期目标时变得疯狂,而这些二进制文件似乎是失败的。
所以...我仍然有这个问题,但这可能解释了我无法“捕捉”??
最佳答案
有关 .NET 中类型加载的有趣事实。在进入使用它的方法时加载类型。加载第一个类型时加载程序集。因此,下面的示例代码(假设“SomeType”是您要查找的程序集中的一种类型)
所以按照这个逻辑你可以有:
static void Main() {
if (CanLoad()) {
DoStuff();
} else {
Console.WriteLine("Some error message");
}
}
static void DoStuff() {
// Ok to reference SomeType here
}
private static bool CanLoad() {
try {
TryLoad();
return true;
} catch {
return false;
}
}
private static void TryLoad() {
Type t = typeof(SomeType);
}
使用这段代码,会发生这样的事情。 Main 正常调用 CanLoad。 CanLoad 不需要任何花哨的类型,因此它愉快地启动,然后尝试调用 TryLoad。但是,TryLoad 具有对“SomeType”的引用,因此当编译器尝试进入该方法时,在执行它的任何部分之前,它会尝试加载包含“SomeType”的程序集。如果失败,该方法将抛出一个 FileNotFoundException 尝试加载它。我们在 CanLoad 中捕获它并返回 false。
非常重要的是“Main”和“CanLoad”都根本没有对该程序集的任何引用(即使在检查之后),否则它们会在检查之前崩溃(记住,加载是在进入方法时完成的,而不是到达线路时),但是“DoStuff”可以引用它想要的任何内容。
关于c# - 务实地检测我是否忘记包含程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45112247/