强制应用程序使用可选DLL运行
本文关键字:DLL 运行 应用程序 | 更新日期: 2023-09-27 17:49:33
我做了桌面应用。我制作了类库,然后从大学汇编中制作了它的DLL。现在我想使库DLL可选。简而言之,我想运行应用程序,无论是否参考库DLL。
现在,如果我删除库DLL的引用,那么它会在库方法上给出错误,它们没有定义。我希望这个应用程序运行时输出库方法错误。
我在谷歌上搜索过,但是我找不到任何可靠的答案。
检查磁盘上是否存在程序集,如果是,使用动态程序集加载:
http://msdn.microsoft.com/en-us/library/25y1ya39.aspx库中被调用的类/方法可以用存根(新的抽象级别)代替,在存根中您可以检查程序集是否成功加载,如果是,则从中调用。
好吧. .非常简单的例子:
"RealAssembly"代码(第一个项目,编译为类库"RealAssembly.dll"):
namespace RealAssembly
{
using System;
public class RealClass
{
Random rand = new Random();
public int SomeProperty { get { return rand.Next(); } }
public string SomeMethod()
{
return "We used real library! Meow!";
}
}
}
"我们的项目"代码与假(存根)类(第二个项目,编译为控制台应用程序-"ClientApp.exe"):
using System;
using System.IO;
using System.Reflection;
namespace ClientApp
{
class FakeClass
{
public int SomeProperty { get { return 0; } }
public string SomeMethod()
{
return "Library not exists, so we used stub! :)";
}
}
class Program
{
// dynamic instance of Real or Fake class
private static dynamic RealOfFakeObject;
static void Main(string[] args)
{
TryLoadAssembly();
Console.WriteLine(RealOfFakeObject.SomeMethod());
Console.WriteLine(RealOfFakeObject.SomeProperty);
Console.WriteLine("Press any key...");
Console.ReadKey();
}
private static void TryLoadAssembly()
{
string assemblyFullName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "RealAssembly.dll");
if (File.Exists(assemblyFullName))
{
var RealAssembly = Assembly.LoadFrom(assemblyFullName);
var RealClassType = RealAssembly.GetType("RealAssembly.RealClass");
RealOfFakeObject = Activator.CreateInstance(RealClassType);
}
else
{
RealOfFakeObject = new FakeClass();
}
}
}
}
这两个项目没有被直接引用。"System"是这两个项目中唯一使用的引用
所以现在,如果编译后的"RealAssembly.dll"存在于同一个目录下,我们将有"we used real library!"在控制台输出的字符串和随机整数。否则,如果"RealAssembly.dll"不存在于同一目录-"库不存在,所以我们使用存根!"