即使缺少依赖DLL也启动exe?

问题描述 投票:0回答:2

在 Dotnet2.0 及更高版本中,如果缺少某个依赖(静态引用)dll 的程序将拒绝启动。

在 Dotnet1.1 和 1.0 中,程序可以启动,但后来在尝试使用缺少的程序集的功能时崩溃了。

我想知道是否有类似的东西

  • 编译器开关,
  • 配置选项或
  • dotnet [属性]

允许我在以下时间启动应用程序 某些 dll 丢失。

是否可以不修改源代码(除了应用一些属性)?

我不想通过程序代码手动加载程序集或使用 IOC-Framworks。

更新:“静态引用的 dll”是指使用反射和 Assembly.Loadxxxx() 在我自己的程序代码中动态加载 dll 的相反操作。

更新2010-12-25 我想得太复杂了。感谢@erinus 的简单解决方案:

我只需要把 try catch 放在周围就可以了:

    using System;
    using System.IO;
    using log4net; // log4net.dll might be missing

    namespace ConsoleAppWithMissingDll
    {
        class Program
        {
            static bool dllIsInstalled = true;
            static void Main(string[] args)
            {
                Console.WriteLine("Hello missing dll");

                try
                {
                    OutputViaLog4Net("hello log4net");
                }
                catch (FileNotFoundException)
                {
                    dllIsInstalled = false;
                    Console.WriteLine("Log4net-dll not found");
                }
                Console.WriteLine("Program continued");
    #if DEBUG
                Console.WriteLine("Press any key to exit");
                Console.ReadKey();
    #endif
            }

            private static void OutputViaLog4Net(string message)
            {

                ILog logger = LogManager.GetLogger("MyLogger");

                logger.Debug(message);

            }
        }
    }
.net configuration attributes assemblies
2个回答
3
投票

“静态引用的 dll”是一个矛盾的说法,dll 中的 d 表示“动态”。 有隐式引用的 dll,但只有非托管代码才使用它们。 如果缺少这样的 DLL,则无法启动程序,该 DLL 在程序的入口点开始执行之前加载。

.NET 根据需要加载 dll,由 JIT 编译器触发。 一旦它编译了存储在该 DLL 中的类型的方法,该 DLL 就会被加载。 传送缺少此类 DLL 的代码在技术上是可能的,您必须小心编写代码,以便永远不会使用此类 DLL 中的类型。 这是桌面版本的行为,不太确定 CF 版本是否也有同样的情况。


1
投票

使用非托管代码。在 try{...}catch{...} 块中调用 Windows API:LoadLibrary。如果缺少 dll,请处理异常并保持进程运行。

© www.soinside.com 2019 - 2024. All rights reserved.