C# 实用地检测我是否忘记包含程序集

C# 实用地检测我是否忘记包含程序集,c#,reference,assemblies,C#,Reference,Assemblies,请参见结尾处的编辑 我有一个应用程序,需要用户安装第三方应用程序才能运行。我想让我的应用程序向用户提供一个警告,如果他们忘记安装这个第三方应用程序,而不是因为试图访问丢失的程序集而退出 在C#中,我想检查是否包含一个程序集 我想我可以用: object.ReferenceEquals(Oject, null) 但是object.ReferenceEquals不喜欢将类型作为输入 我试过: var type = (from assembly in AppDomain.CurrentDom

请参见结尾处的编辑

我有一个应用程序,需要用户安装第三方应用程序才能运行。我想让我的应用程序向用户提供一个警告,如果他们忘记安装这个第三方应用程序,而不是因为试图访问丢失的程序集而退出

在C#中,我想检查是否包含一个程序集

我想我可以用:

object.ReferenceEquals(Oject, null)
但是object.ReferenceEquals不喜欢将类型作为输入

我试过:

    var type = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
        from type2 in assembly.GetTypes()
        where type2.Name == "Oject"
        select type2);
    if (type == null) {...}
但是VisualStudio告诉我类型永远不能为null

那么:有没有一种简单的方法可以检测我在访问程序集之前是否忘记包含程序集(而应用程序只是在没有警告或消息告诉用户为什么退出的情况下退出)

我想我可以用

try
{
    types = assembly.GetTypes();
}
catch (ReflectionTypeLoadException ex)
{
    types = ex.Types.Where(p => p != null).ToArray();
}
from:但是我在Program.cs中做这个检查,这是一个静态类

编辑: 事实证明,我有引用的程序集,但这些程序集可能没有安装正确的逻辑。因此,所有的二进制文件都附带了参考资料,但由于没有安装第三方应用程序,这些二进制文件在无法达到预期目标时变得疯狂,而这些二进制文件似乎是失败的


所以。。。我仍然有这个问题,但它可能会解释我无法“捕获”?

一个关于.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不需要任何花哨的类型,因此它会愉快地启动,然后尝试调用TryLoad。然而,TryLoad有一个对“SomeType”的引用,因此当编译器在执行该方法的任何部分之前尝试输入该方法时,它会尝试加载包含“SomeType”的程序集。如果失败,该方法将抛出FileNotFoundException并尝试加载它。我们在CanLoad中捕获它并返回false


非常重要的是,“Main”和“CanLoad”都不能引用该程序集(即使在检查之后),否则它们会在检查之前崩溃(记住,加载是在输入方法时完成的,而不是在到达行时完成的),但是“DoStuff”可以引用它想要的任何内容。

在或中有什么有用的吗?似乎AssemblyResolve事件可能是进一步搜索的好关键字?旁注:如果您不将所有代码放入Main,您甚至不会遇到此问题。。。尝试/捕获调用第三方程序集的方法就足够了。在第二个代码段中,您需要
if(!type.Any())
。linq返回类型列表,而不是一种类型。列表永远不会为空,但可以为空。我试过这个,但它不“接住”。进程刚刚结束。我的应用程序刚刚终止,无法捕获。我尝试过使用:“using(Object o=Object.xx),应用程序只是终止,没有到达Catch部分。你有两种不同的方法“CanLoad”和“TryLoad”吗"? 或者你试着把它们合并成一个?很有趣。好啊1) 我不知道为什么分离它们是不同的,2)这段代码运行良好。TryLoad工作正常。我对原来的问题进行了修改。结果是程序集被引用,并且可以加载,但是该程序集引用的第三方软件丢失了,因此“SomeObject”加载,但在尝试初始化时,以某种方式失败,我无法“捕获”失败。它只是出口。代码可能不会引发异常?如果您无法捕捉到它,它们可能会执行许多操作,例如调用Environment.Exit或其他非基于异常的出口。没有更多的细节,我帮不了什么忙。我试图解释为什么分离方法与类型加载的时间有关。