Если я установил для параметра «Копировать локально» значение «false» для ссылочного проекта, основной проект не сможет найти сборку - PullRequest
2 голосов
/ 15 декабря 2011

Я пытаюсь разработать приложение, которое использует плагины. У меня есть один проект для основного приложения, один для общих элементов, которые плагины могут / должны использовать, и один для тестового плагина. Основной проект и проект тестового плагина ссылаются на общие элементы. Если я оставлю для Copy Local значение true, то получу три копии общих элементов (будет хуже, когда у меня будет больше плагинов), и я думаю, что это испортит отражение. Когда основная программа пытается отразить пользовательский атрибут (определенный в общем), примененный к классу в тестовом плагине, используя

Object[] attributes = pluginType.GetCustomAttributes(typeof(PluginAttribute), true);

Я не нахожу атрибут, но когда делаю:

Object[] attributes = pluginType.GetCustomAttributes(true);

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

Казалось бы, решение было бы отключить Copy Local. Однако, когда я это делаю, я получаю ошибку времени выполнения, что программа не может найти сборку, содержащую общие элементы. Как мне сообщить среде выполнения, где ее искать?

Любая помощь будет высоко ценится!

Edit:

Хорошо, вот еще несколько подробностей сценария.

У меня есть три проекта в решении. Один из них для dll, давайте назовем его Common, который я оставляю в каталоге, выбранном для него VS, поэтому dll заканчивается в ./Common/bin/Debug. DLL содержит определения интерфейса, который должны реализовывать все плагины: что-то вроде

namespace Common
{
    [ContractClass(typeof(PluginContract))]
    public interface IPlugin
    {
        String Foo();
    }
}

Он также содержит определение класса атрибута, который может быть применен к плагинам, например:

public class PluginAttribute: Attribute
{
    public String Bar {get; protected set;}
    public PluginAttribute(String bar)
    {
        this.Bar = bar;
    }
}

Следующим проектом является Host, который является исполняемым файлом. Опять же, это каталог по умолчанию, поэтому исполняемый файл находится в ./Host/bin/Debug. Он ищет сборки в ./Host/bin/Debug/Plugins и использует отражение для поиска в каждой сборке классов, реализующих IPlugin. Если это так, то я использую код, который я цитировал выше, чтобы увидеть, имеет ли он установлен PluginAttribute.

Последний проект - это тестовый плагин, который я установил для ./Host/bin/Debug/Plugins.

namespace TestPlugin
{
    [PluginAttribute("Test Class")]
    public class TestClass: IPlugin
    {
        public string Foo()
        {
            return "Foo";
        }
    }
}

Хост находит TestClass в сборке TestPlugin очень хорошо, но у меня проблемы с доступом к атрибуту Plugin. Моя догадка состоит в том, что это потому, что у меня есть три копии Common.dll, и что есть проблема с Хостом, использующим копию в ./Host/bin/Debug, но TestClass предположительно построен с копией в ./Host/bin/Debug/Plugins , физически другой dll (делает ли это другой сборкой, или это просто еще одна копия того же самого dll?) Итак, чтобы развить это предположение, я попытался установить для параметра «Локальное копирование» значение false, поэтому я получил только одну копию Common.dll в ./Common/bin/Debug. Это прекрасно работает, но выдает ошибку времени выполнения, что не может загрузить общую сборку.

1 Ответ

0 голосов
/ 15 декабря 2011

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

http://msdn.microsoft.com/en-us/library/system.appdomain.appendprivatepath.aspx

Извините, я не совсем понял сценарий того, с чем вы столкнулись. Это просто решение для определения места сборки.

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