Как мне ссылаться на dll, когда "добавлено как ссылка" в проекте? - PullRequest
3 голосов
/ 22 сентября 2011

У меня есть два DLL-файла в дереве проекта (не ссылки). Они добавляются как ссылки, они являются сборками другого проекта в решении. Я пытаюсь установить их действие сборки на встроенный ресурс, чтобы я мог импортировать их в файл .exe. Я не могу написать с помощью оператора, поэтому я не могу ссылаться на них в текущем проекте. Как это можно сделать?

файл проекта http://img593.imageshack.us/img593/7048/dll.png

1 Ответ

4 голосов
/ 22 сентября 2011

Вам необходимо добавить жесткую ссылку на сборки и установить для их параметра «Копировать локально» значение «Ложь», а затем извлечь их из встроенных ресурсов в каталог приложения перед их вызовом.Вы не можете ссылаться на ссылку (ярлык), как вы хотите.

Ключевые точки (в этом примере) и статья блога с примером кода

  • Жесткие ссылки EmbeddedReferenceApplication EmbeddedReference.dll
  • Свойство ссылки EmbeddedReferenceДля параметра «Локальное копирование» задано значение «Ложь»
  • Связанная сборка (Добавить как ссылку) установлена ​​как встроенный ресурс

Вот рабочий пример.(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!");
        }
    }
}
...