2

Я использую для Windows Workflow Foundation с пользовательских деятельности, и я хотел бы создать пользовательский дизайн для этих видов деятельности в моем рабочем процессе.Создание пользовательских проектной деятельности без ссылки на дизайн DLL в Windows Workflow Foundation

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

Это то, что я бы не хотел делать, потому что DLL Designer не следует развертывать в производственной среде. Мне хотелось бы иметь собственный дизайн в редакторе рабочих процессов Visual Studio.

Я был в состоянии получить все работает, добавив следующее:

[Designer("namespace,dll")] 
public class CustomActivity : NativeActivity<string> 

и после этого копируя длл в Visual Studio пути. Это опять-таки то, что я бы не хотел делать, потому что каждый разработчик должен это сделать и сделать сборку так, чтобы dll скопировался, какой-то фиксированный путь к визуальной студии не очень хорош.

Я использовал эти два примера, но мне кажется, что оба они непосредственно относятся к DLL:

Я бы предположить такой функции будет каким-то образом поддерживаться Visual Studio/Workflow Foundation.

У вас есть идеи, как решить эту проблему? Благодаря!

+0

Существует перегрузка для DesignerAttribute, которая берет две строки, если я помню. Во-первых, это пространство имен, а другое - имя типа. Если вы используете это, вы можете избежать ссылок. Но вам нужно: 1) загрузить сборку вручную в конструктор AppDomain или 2) следовать правилам расположения узлов сборки. Для визуальной студии я задокументировал это в [этом ответе] (http://stackoverflow.com/a/8886905/1228). Не уверен, что этого достаточно, чтобы ответить на ваш вопрос. Как вы думаете? – Will

+0

Спасибо за быстрый ответ! Если вы проверите, я действительно использую перегрузку двух строк. Я проверил ваш ответ по другому вопросу и, похоже, подтвердил мои предыдущие выводы о том, что DLL можно скопировать в папку с визуальной студией, и все может сработать таким образом, но, как я уже говорил, я бы не предпочел это решение. Я также быстро попробовал решение GAC (зарегистрировать dll для GAC, когда оно будет построено), но я не смог заставить его работать. Вероятно, я должен попробовать еще раз. –

+0

Извините, на самом деле я использую одну перегрузку строки, мой плохой :) Я также проверю это. –

ответ

0

Атрибут Designer (используя «магическую» строку) не является чем-то очень надежным. Если вы измените имя класса или пространство имен, у вас не будет ошибки компиляции. Существует еще один (лучше имхо) способ сделать это с помощью IRegisterMetadata реализации:

  1. Ваш Design узел должен ссылаться на сборку активности, но это, как правило, не может быть предотвращено.
  2. Добавьте частичный класс (.cs) к вашему дизайнеру XAML
  3. Этот класс должен унаследовать от System.Activities.Presentation.Metadata.IRegisterMetadata. этот интерфейс определяет только один метод для реализации.

Вот пример реализации:

public void Register() 
{ 
    AttributeTableBuilder builder = new AttributeTableBuilder(); 
    builder.AddCustomAttributes(
     typeof(MyActivity), 
     new DesignerAttribute(typeof(MyActivityDesigner))); 
    MetadataStore.AddAttributeTable(builder.CreateTable()); 
} 

Далее, вы хотите иметь собственный конструктор, используемый в Visual Studio. Visual Studio имеет строгие правила автоматической загрузки сборщиков дизайнеров. Вам необходимо:

  1. Ваш дизайнерский проект должен иметь то же имя, что и ваш проект деятельности, с добавлением «.Design» в конце.Пример:
    • Activiy проекта: MyApp.Activities.dll
    • конструктор проекта: MyApp.Activities.Design.dll
  2. Библиотеки DLL .Design должен находиться в том же каталоге, чем DLL деятельности. Вы можете автоматизировать это с помощью события post build в дизайнерском проекте.

Важно Edit:

теперь я вижу, что ваши ссылки уже представить этот метод, но вы говорите, что он непосредственно ссылаться на DLL. Да, DLL DESIGN ссылается на dll ACTIVITY. Но вы спросили об обратном: DLL активности не должна ссылаться на конструкторскую dll. Используя метод IRegisterMetadata, ваша DLL DESIGN может ссылаться на dll ACTIVITY, это не проблема: вы можете удалить проект dll из выпущенного пакета, DLL активности будет работать нормально.

+0

благодарит за комментарий. Я пробовал точную конфигурацию, которую вы предоставили, но я не могу заставить ее работать. Ссылаясь на DLL Activity из DLL Design, все в порядке, и именно так я его и использовал. Эта конфигурация очень похожа на то, как это делается в примерах, но в обоих примерах есть третий проект автономного редактора, который ссылается как на библиотеки DLL, так и на работу в этих примерах. Только место, где визуальная студия ищет DLL Design, находится внутри собственной папки IDE (я отслеживал поиск dll с помощью инструментов мониторинга dll). –

+0

Так что копирование DLL в папку Visual Studio работает, и дизайн виден. На мой взгляд, это доказывает, что регистрация метаданных в порядке, и именование DLL работает. –

+0

У меня также было трудное время, чтобы заставить его работать, но я могу заставить его работать, не копируя DLL в папку VS. И у меня есть только 2 проекта (действия/дизайнеры), поэтому привязка находится в dll дизайнера, а не в третьем проекте. Проверьте свою ссылку на DLL активности, возможно, вы не ссылаетесь на нее в выходной папке (?). DLL .Design должна находиться в одной папке. Извините, у меня нет больше советов, которые помогут вам. – Fabske