在Dotnet2.0及更高版本中,如果其中一个依赖(静态引用)的dll丢失,程序将拒绝启动。
使用Dotnet1.1和1.0程序启动但稍后在尝试使用缺少的程序集的功能时崩溃。
我想知道是否有像
这样的东西允许我在什么时候启动应用 某些dll丢失了。
是否可以不对源代码进行模糊处理(通过应用一些Attriutes来执行)?
我不想通过程序代码手动加载程序集或使用IOC-Framworks。
更新:使用“静态引用的dll”,我的意思与使用反射和Assembly.Loadxxxx()在我自己的程序代码中动态加载dll相反。
更新2010-12-25我在考虑复杂化。感谢来自@erinus的简单解决方案:
我只需要尝试捕捉它就可以了:
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);
}
}
}
答案 0 :(得分:3)
“静态引用的dll”是矛盾的,dll中的d表示“动态”。有隐式引用的dll但只有非托管代码使用这些。您无法启动缺少这样的DLL的程序,在程序的入口点开始执行之前加载了DLL。
.NET按需加载dll,由JIT编译器触发。只要它编译存储在该DLL中的类型的方法,就会加载DLL。丢失此类DLL的运输代码在技术上是可行的,您必须小心编写代码,以便永远不会使用来自此类DLL的类型。这是桌面版本的行为,不太确定CF版本的工作方式是否相同。
答案 1 :(得分:1)
使用非托管代码。在try {...} catch {...}块中调用Windows API:LoadLibrary。如果缺少dll,请处理异常并保持进程运行。