2011-09-21 67 views
3

我在項目樹中有兩個dll文件(不是引用)。它們被添加爲鏈接,它們是解決方案中其他項目的組件。我試圖將他們的Build Action設置爲Embedded Resource,所以我可以將它們導入到.exe文件。我無法使用語句編寫代碼,因此我無法在當前項目中引用它們。如何做到這一點?如何在項目中「作爲鏈接添加」時引用dll?

project file http://img593.imageshack.us/img593/7048/dll.png

+0

如果任何人試圖做同樣的事情:我做到了用另一種方法。 看看這個[問題](http://stackoverflow.com/questions/7500877/how-do-i-import-referenced-projects-into-exe) –

回答

4

你需要一個硬引用從嵌入式資源添加到組件,並設置其複製本地爲False,然後提取該組件到應用程序目錄,他們在被調用之前。你不能引用你想要的鏈接(快捷方式)。

要點(在這個例子中)和Blog Article with Example Code

  • EmbeddedReferenceApplication硬引用EmbeddedReference.dll
  • EmbeddedReference參考屬性複製本地設置爲False
  • 鏈接組件(如添加鏈接)設置作爲嵌入式資源

下面是一個工作示例。 (EmbeddedReferenceApplication.exe |控制檯應用程序)

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.IO; 
using System.Windows.Forms; 
using System.Reflection; 
using EmbeddedReference; // Hard reference with Copy Local = False 

namespace EmbeddedReferenceApplication { 
    class Program { 
     static void Main(string[] args) { 
      AppDomain.CurrentDomain.AssemblyResolve += AppDomain_AssemblyResolve; 
      MyMain(); 
     } 

     private static void MyMain() { 
      EmbeddedReference.MessageHelper.ShowMessage(); 
     } 

     private static Assembly AppDomain_AssemblyResolve(object sender, ResolveEventArgs args) { 
      string manifestResourceName = "EmbeddedReferenceApplication.EmbeddedReference.dll"; // You can also do Assembly.GetExecutingAssembly().GetManifestResourceNames(); 
      string path = Path.Combine(Application.StartupPath, manifestResourceName.Replace("EmbeddedReferenceApplication.", "")); 
      ExtractEmbeddedAssembly(manifestResourceName, path); 
      Assembly resolvedAssembly = Assembly.LoadFile(path); 
      return resolvedAssembly; 
     } 

     private static void ExtractEmbeddedAssembly(string manifestResourceName, string path) { 
      Assembly assembly = Assembly.GetExecutingAssembly(); 
      using (Stream stream = assembly.GetManifestResourceStream(manifestResourceName)) { 
       byte[] buffer = new byte[stream.Length]; 
       stream.Read(buffer, 0, buffer.Length); 
       using (FileStream fstream = new FileStream(path, FileMode.Create)) { 
        fstream.Write(buffer, 0, buffer.Length); 
       } 
      } 
     } 
    } 
} 

在EmbeddedReference.dll

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace EmbeddedReference { 
    public static class MessageHelper { 
     public static void ShowMessage() { 
      Console.WriteLine("Hello World!"); 
     } 
    } 
} 
+0

當它不被複制時我甚至不能運行它。你能提供一個例子嗎?我需要以某種方式動態獲取dll。它必須每次構建。 –

+0

在任何代碼調用之前,您都必須提取程序集*,在運行任何代碼之前,執行此操作的最佳位置應該放在您的Program.cs類中。否則,當你的程序運行一行代碼來調用引用該程序集的代碼並且它不能被解析時,你的應用程序將會崩潰。 –

+0

你能舉個例子嗎? –

相關問題