2010-11-12 2 views
2

Я делаю приложение, которое почти выполнено, но есть одна вещь, которая меня прослушивает. Для запуска приложения требуется около 12-13 файлов, которые должны находиться в каталоге папки (некоторые .dll, некоторые .xml-файлы и т. Д.), И я хочу сделать мое приложение максимально компактным, что означает, что я хочу как меньше файлов для работы с приложением. Итак, мой вопрос: как я могу это сделать? Могут ли все файлы быть включены в приложение? Нужно ли, чтобы .dlls находились в папке приложения или я могу ссылаться на них из другого места? Я думал создать папку для всех этих файлов, но я не думаю, что мое приложение будет запущено, если файл .dll не будет помещен в тот же каталог, что и приложение.Ссылка на файлы

+1

Если вы перейдете на страницу вашего профиля, вы увидите ряд вопросов без принятых ответов. (Те, у кого количество ответов в белом, в отличие от желтого). В каждом из этих вопросов нажмите полый флажок рядом с наиболее полезным ответом. – SLaks

ответ

0

How to embed and access resources by using Visual C# выглядит как раз то, что вам нужно.
[править] Если вы хотите загрузить DLL-библиотеки, вы можете объединить выше с AppDomain.AssemblyResolve SLaks событий упоминается как это:

using System.IO; 
using System.Reflection; 

namespace ConsoleApplication3 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     AppDomain currentDomain = AppDomain.CurrentDomain; 
     currentDomain.AssemblyResolve += 
       new ResolveEventHandler(MyResolveEventHandler); 
     var myWrappedClass1 = 
      currentDomain.CreateInstance(
        "ConsoleApplication3.ClassLibrary1.dll", 
        "ClassLibrary1.Class1"); 
     var myClass1 = myWrappedClass1.Unwrap(); 
     Console.WriteLine(myClass1.GetType().InvokeMember(
        "Add", 
        BindingFlags.Default | BindingFlags.InvokeMethod, 
        null, 
        myClass1, 
        new object[] { 1, 1 })); 
     Console.ReadLine(); 
    } 

    private static Assembly MyResolveEventHandler(
      object sender, ResolveEventArgs args) 
    { 
     Assembly currentAssembly=null; 
     Stream dllStream; 
     try 
     { 
      currentAssembly = Assembly.GetExecutingAssembly(); 
      dllStream = 
        currentAssembly.GetManifestResourceStream(args.Name); 
      var length = (int)dllStream.Length; 
      var dllByteArray = new byte[length]; 
      int bytesRead; 
      int offset = 0; 
      while ((bytesRead = dllStream.Read(
            dllByteArray, 
            offset, 
            dllByteArray.Length - offset)) 
        > 0) 
       offset += bytesRead; 
      return Assembly.Load(dllByteArray); 
     } 
     catch 
     { 
      Console.WriteLine("Error accessing resources!"); 
     } 
     return null; 
    } 
    } 
} 

где Class1 является библиотека классов, содержащая только:

namespace ClassLibrary1 
{ 
    public class Class1 
    { 
     public int Add(int x, int y) 
     { 
      return x + y; 
     } 
    } 
} 

и DLL добавляется в качестве встроенного ресурса в файл:

alt text alt text

+0

Если пример, который они приводят, недостаточно актуальен, дайте мне знать, какую версию .NET вы разрабатываете, и я приведу вам пример кода. –

+0

Можете ли вы также сделать это с .DLL-файлами? Я знал, что вы можете встраивать ресурсы таким образом, но в свойствах ничего не отображается, когда вы щелкаете правой кнопкой мыши и выбираете свойства файла .dll. Кроме того, я использую .NET Framework 4.0 – david

+0

Привет, Дэвид, пожалуйста, дайте мне знать, если этот пример делает его более понятным. –

0

Заканчивать this post

Microsoft предоставляет средства для этой цели

2

Вы можете обрабатывать AppDomain.AssemblyResolve event и вызвать Assembly.Load(path) для загрузки библиотек DLL из нестандартных папок.

Вы даже можете позвонить Assembly.Load(byte[]), чтобы загрузить DLL, встроенную в ваш EXE, в качестве ресурса.

Обратите внимание, что JITTER загрузит все типы, используемые методом до начала запуска метода (для компиляции метода).
Поэтому вы должны добавить обработчик событий, прежде чем использовать какие-либо методы или типы в DLL, а метод, который добавляет обработчик, не может напрямую использовать библиотеки DLL.

+0

Спасибо за информацию! Я еще не играл с событиями AssemblyResolve, но теперь я вижу, каким будет мой проект на выходные. :-) –

0

Похоже, вы можете использовать Embedded Resources для части этого файла (все, кроме DLL). Вы можете использовать ILMerge, чтобы объединить ваши сборки после компиляции, у ILMerge есть некоторые ограничения ...

Смежные вопросы