Ссылка на сборку .NET 101 - PullRequest
1 голос
/ 20 июня 2010

У меня следующий класс, расположенный в сборке A. Сборка имеет ссылку на StructureMap 2.6.1.

public static class Bootstrapper
{
    public static void Bootstrap(string databaseName)
    {
        StructureMapBootstrapper.Bootstrap(databaseName);
    }
}

Я ссылаюсь на сборку A в совершенно разных сборках (B) и I "получая следующую ошибку времени выполнения при вызове этой строки:

Bootstrapper.Bootstrap(db);

Ошибка времени выполнения:

FileNotFoundException: Не удалось загрузить файл или сборку 'StructureMap, Version = 2.6.1.0, Culture= нейтральный, PublicKeyToken = e60ad81abae3c223 'или одна из его зависимостей. Система не может найти указанный файл.

Мне постоянно приходится копировать StructureMap.dll в каталог bin сборки B. Это невероятно раздражает.Любые предложения о том, как решить эту проблему? Кто-нибудь знает общие правила относительно того, когда сборки B, на которые ссылается AssemblyA, понадобится AssemblyB?

Спасибо!


Спасибо за быстрые ответы! IЯ подумал о простом добавлении StructureMap в качестве справочного материала, однако в моем дизайне я использовал абстрагирование подложные реализации вдали от потребителя.Другими словами, сборка B будет игнорировать тот факт, что StructureMap в конечном итоге используется.Кроме того, если бы я GAC StructureMap, то я столкнулся бы с проблемами развертывания правильно?Если я разверну сайт на хост-машине, на которой нет глобального каркаса StructureMap, я вернусь к исходной точке.Мне любопытно, как истинная абстракция может быть реализована с помощью этой ссылки на сборку.

Ответы [ 4 ]

2 голосов
/ 22 июня 2010

Существует отличный инструмент под названием Refix , который вы можете использовать для проверки и исправления ваших зависимостей.

1 голос
/ 20 июня 2010

Чтобы избежать копирования DLL, вы можете добавить StructureMap.dll в ваш проект и сделать так, чтобы VS автоматически копировал его в вывод при сборке AssemblyA.

Или вы можете использовать ILMerge для объединения StructureMap.dll вСборка B, и не беспокойтесь о ее копировании, поскольку сборка B будет содержать все необходимые IL.

Или вы можете добавить StructureMap.dll в глобальный кэш сборок, что должно позволить .NET найти его, не имеяскопировать это.Тем не менее, IIRC, все сборки GAC нуждаются в строгих именах.

0 голосов
/ 14 октября 2011

Если вы хотите, чтобы Сборка B не знала о зависимости от StructureMap, но также избегала каждый раз копировать файл вручную, вы можете добавить StructureMap в качестве ссылки на Сборку A (как говорили другие) и установить путь вывода сборки обоих проектов на тот же каталог (через Свойства проекта-> вкладка Сборка). Таким образом, сборка А тоже может «увидеть» это.

0 голосов
/ 20 июня 2010

Кроме того, поскольку сборка имеет строгое имя (вы можете увидеть это по факту, что она имеет значение для PublicKeyToken), вы можете установить сборку StructureMap в GAC , что сделает его доступным для любого приложения .NET, работающего в системе. Это, вероятно, решит вашу проблему.

Что касается развертывания со сборкой в ​​GAC, это зависит от того, как вы планируете развертывать. Я предполагаю, что это приложение Winforms, поэтому я также предполагаю, что вы будете развертывать через проект установки. Если это так, тогда легко включить сборку, которая должна идти в GAC, в проект, и она установит ее там, если ее нет.

Однако, чтобы ответить на ваш вопрос, привязка сборки и загрузка несколько нюансированы, но общее правило состоит в том, что сборка загружается при первой загрузке содержащего ее типа. Тип загружается, как только блок кода, который ссылается, находится в активном фрейме стека.

Последнее предложение сводится к следующему: тип загружается, когда происходит одно из следующих действий:

  • Загружен другой тип, который использует рассматриваемый тип в качестве экземпляра или статической переменной

Например, скажем, у меня есть типы A, B и C.

public class A
{

}

public class C
{

}

public class B
{
    private A myA;
    private static C myC;
}

Когда загружен тип B, он также загрузит A, потому что он используется в качестве переменной экземпляра, а C будет загружен, потому что он используется в качестве статической переменной.

  • Функция, которая использует рассматриваемый тип в качестве локальной переменной, параметра или вызывает другую функцию, которая использует его в качестве параметра.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...