我已经创建了桌面应用程序。我已经做了类库,然后从大会大会制作它的DLL。现在我想让库DLL可选。总之,我想运行应用程序的天气或不DLL库被引用。强制应用程序使用可选DLL运行
现在,如果我删除了库DLL的引用,那么它会给库方法带来错误,因为它们没有被定义。我希望这个应用程序运行时给出库方法的错误。
我在谷歌搜索,但我无法找出任何可靠的答案。
我已经创建了桌面应用程序。我已经做了类库,然后从大会大会制作它的DLL。现在我想让库DLL可选。总之,我想运行应用程序的天气或不DLL库被引用。强制应用程序使用可选DLL运行
现在,如果我删除了库DLL的引用,那么它会给库方法带来错误,因为它们没有被定义。我希望这个应用程序运行时给出库方法的错误。
我在谷歌搜索,但我无法找出任何可靠的答案。
检查是否存在磁盘上的组装,如果这是真的使用动态装配载荷:
http://msdn.microsoft.com/en-us/library/25y1ya39.aspx
调用类/库中的方法可以通过存根进行更换(新的抽象级别),其中你可以检查程序集是否被成功载入,如果是,则从中调用。
确定..很简单的例子:
“真实大会” 代码(第一个项目,编译为类库 “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();
}
}
}
}
这两个项目没有直接引用。 “系统”是这两个项目中唯一使用的参考。
所以现在,如果编译过的“RealAssembly.dll”存在于同一个目录中,我们将会有“我们使用真正的库!喵!”字符串和随机整数在控制台输出。否则,如果“RealAssembly.dll”不存在于同一目录中 - “库不存在,所以我们使用了存根!:)”,并且将显示0。
感谢您的回复。但我想要的是,我不想反对汇编和我的应用程序不给错误。 –
这是执行此操作的一种方法。 您不需要直接在项目“引用”中引用程序集 - 相反,如果程序集“dll”存在于磁盘某处,并且它存在(或者例如在用户按下某些“加载大学图书馆“按钮) - 加载它。 如果库不存在 - 代码将使用新的类(必须写入),如果加载它将从动态加载的程序集调用代码。 如果你愿意,我甚至可以显示简单的例子.. – rufanov
是请出示一些例子 –
没有它的重复。我想要的是运行一个应用程序与给出参考DLL –
我没有看到一个点在这里。如果你在调用外部DLL的方法,你应该参考它。你期望编译器做什么?忽略公然错误? – danish