0

TL: DR Как ссылаться на сборку только в библиотеке классов, а не на библиотеку и на вызывающий проект?Как правильно разрешать ссылки DLL через библиотеки классов без добавления ссылки на вызывающий проект

Я создаю библиотеку утилиты в C#, чтобы продвигать повторное использование кода. В этом случае, я хотел сделать что-то вещи с сервера TFS и нужно ссылаться на несколько сборок со стороны TFS вещей:

  • Microsoft.TeamFoundation.Client
  • Microsoft.VersionControl.Client
  • Microsoft.WorkItemTracking.Client

Я включаю эти ссылки в библиотеку классов, называемую, скажем, утилитой. Затем я перехожу к обертке объектов в этих сборках в вспомогательных объектах. Ошибок нет, intellisense работает правильно и т. Д.

Когда я хочу использовать эту библиотеку классов в другом проекте внутри одного и того же решения, скажем, TestCLI, я добавляю ссылку на проект Utility, выбирая проект со вкладки ссылок на решения. Затем я могу использовать классы Utility без проблем, пока не приступлю к созданию.

Когда я построить решение, вдруг выдает ошибку, такие как:

The type 'Microsoft.TeamFoundation.VersionControl.Client.BranchObject' is defined in an assembly that is not referenced. You must add a reference to assembly 'Microsoft.TeamFoundation.VersionControl.Client, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a

В прошлом я работал вокруг этого вопроса, добавив те же ссылки на проект вызывающего (TestCLI) в дополнение к библиотеке классов (Утилита). Я чувствую, что это побеждает одну из целей наличия библиотеки классов и что я пропустил шаг, чтобы не беспокоиться о ссылках на библиотеки в моем вызывающем проекте.

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

+2

Если это происходит из-за того, что ваша библиотека подвергает классы или методы из других библиотек напрямую, и поэтому требуется ссылка. Если вы полностью спрячете объекты других библиотек, он не должен ссылаться на них. – Gusman

+0

Теперь я чувствую себя таким идиотом. Это делает гораздо больше смысла, чем его нарушение. У меня есть небольшая работа, чтобы решить эти изменения. Знаете ли вы, есть ли способ вставить эти ссылки, чтобы даже если я хочу использовать некоторые из объектов, я могу без ссылки на них? Кроме того, если вы хотите, напишите ответ, и я приму его. В противном случае я могу написать так, чтобы у него было что-то для этого. – Gilbrilthor

+0

Ну, вы не можете разоблачить объекты вообще, но вы можете инкапсулировать их, это зависит от того, что вы подвергаете. Если это классы данных, вы можете просто создать копию этого класса в своей библиотеке, если это функции, вы можете создать для них обертку. – Gusman

ответ

2

Ссылки требуются, потому что вы подвергаете объекты из других библиотек, а затем для использования этих классов конечная программа нуждается в ссылках.

Чтобы избежать этого, вы должны скрыть внешние объекты, через оболочку, копию класса или что-то еще, это зависит прежде всего от того, что и почему вы подвергаете эти объекты.