2014-03-12 27 views
1

我已经创建了桌面应用程序。我已经做了类库,然后从大会大会制作它的DLL。现在我想让库DLL可选。总之,我想运行应用程序的天气或不DLL库被引用。强制应用程序使用可选DLL运行

现在,如果我删除了库DLL的引用,那么它会给库方法带来错误,因为它们没有被定义。我希望这个应用程序运行时给出库方法的错误。

我在谷歌搜索,但我无法找出任何可靠的答案。

+0

没有它的重复。我想要的是运行一个应用程序与给出参考DLL –

+0

我没有看到一个点在这里。如果你在调用外部DLL的方法,你应该参考它。你期望编译器做什么?忽略公然错误? – danish

回答

1

检查是否存在磁盘上的组装,如果这是真的使用动态装配载荷:

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。

+0

感谢您的回复。但我想要的是,我不想反对汇编和我的应用程序不给错误。 –

+0

这是执行此操作的一种方法。 您不需要直接在项目“引用”中引用程序集 - 相反,如果程序集“dll”存在于磁盘某处,并且它存在(或者例如在用户按下某些“加载大学图书馆“按钮) - 加载它。 如果库不存在 - 代码将使用新的类(必须写入),如果加载它将从动态加载的程序集调用代码。 如果你愿意,我甚至可以显示简单的例子.. – rufanov

+0

是请出示一些例子 –

相关问题