2016-02-06 12 views
0

Извините за заголовок. Я не знаю, как кратко описать эту проблему. Моя проблема в том, что у меня есть class-library, у которого есть references to other (third party) DLLs. Мне нужно использовать эту библиотеку классов в другом проекте, поэтому я, очевидно, добавил DLL моей библиотеки классов в свой основной проект.Библиотека классов теряет ссылки (dll) при использовании

Когда я запускаю свой основной проект, всегда возникает ошибка, в которой говорится, что ссылка (dll) в моей библиотеке классов не найдена.

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

Я действительно не хочу добавлять всю библиотеку классов в качестве проекта для каждого «хоста» -проекта, который я делаю.

У кого-нибудь есть идея, почему эта ошибка возникает при добавлении DLL-библиотеки классов, но не в том случае, когда весь проект библиотеки классов добавлен в качестве ссылки?

Должно быть решение, чтобы эта работа работала, даже если я не добавляю весь проект библиотеки в качестве ссылки. В противном случае не было бы смысла создавать библиотеку классов, верно?

К слову: Моя библиотека классов содержит сторонние библиотеки DLL, а для свойства локальной копии сторонней библиотеки dll установлено значение true.

Заранее благодарен!

Редактировать: Моя цель - действительно сделать портативную библиотеку классов, даже если она содержит сторонние библиотеки. Я хочу предоставить только .dll другому компьютеру и использовать его без добавления всего проекта библиотеки классов каждый раз.

ответ

1

Ошибка в том, что вы не копируете dll во втором проекте, вы добавили ссылку на вашу dll, чтобы она была скопирована, но не с dll, на которую ссылается ваша dll, поэтому отсутствуют библиотеки.

Или вы перераспределить dependencys с вашей DLL или вы можете возможность размещения в DLL файлы внутри библиотеки DLL в качестве ресурсов, а затем перехватывать загрузки сборки и обеспечить его через ресурс: http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx

EDIT: Для того, чтобы сделать его внутри dll вам нужно использовать статический класс и вызвать статический инициализатор, прежде чем использовать любой из классов, которые зависят от других библиотек.

Вот пример настройки:

-A библиотека называется библиотека B, которая поставляет простой класс, как это:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace LibraryB 
{ 
    public class ReferencedClass 
    { 
     public int GetIt() 
     { 

      return 5; 

     } 
    } 
} 

-A библиотека называется LibraryA, которая ссылается на материалы и библиотека B два класса, инициализатор и реальный класс:

Initializer

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Reflection; 
using System.Text; 
using System.Threading.Tasks; 

namespace LibraryA 
{ 
    public static class Initializer 
    { 
     public static void Init() 
     { 
      AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => 
      { 

       if (!args.Name.StartsWith("LibraryB")) 
        return null; 

       return Assembly.Load(LibraryA.Properties.Resources.LibraryB); 

      }; 
     } 
    } 
} 

Класс

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace LibraryA 
{ 
    public class RealClass 
    { 
     public int DoIt() 
     { 

      LibraryB.ReferencedClass cl = new LibraryB.ReferencedClass(); 
      return cl.GetIt(); 

     } 
    } 
} 

LibraryA также имеет скомпилированную библиотеку LibraryB.dll внедренную в качестве ресурса.

-A проект под названием Test, который только ссылается LibraryA:

using LibraryA; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Initializer.Init(); 
      RealClass c = new RealClass(); 
      Console.WriteLine("From LibraryA: " + c.DoIt()); 
      Console.ReadKey(); 
     } 
    } 
} 

Если настройка everithing правильно, и вы его выполнения он будет работать, помните, что если вы делаете через визуальные студии, против скопирует dll, чтобы сделать настоящий тест после компиляции всех экземпляров exe и LibraryA и выполнить, он будет работать без использования библиотеки LibraryB и LibraryB из библиотеки.

+0

Он упоминает, что это работает с исполняемыми файлами (.exe). Это также работает с .dll? Я никогда раньше этого не делал и ничего не слышал об этом. Спасибо, кстати. это, похоже, правильное начало для решения этой проблемы. –

+0

Должно быть, но я не на 100% безопасен, лучший способ - проверить – Gusman

+0

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