Краткая версия:
Как загрузить рабочий процесс WF4 из XAML? Важная деталь: код, загружающий рабочий процесс, не обязательно должен знать, какие типы используются в рабочем процессе.
Длинная версия:
Мне очень тяжело загружать рабочий процесс WF4 из файла XAML, создаваемого Visual Studio. Мой сценарий заключается в том, что я хочу поместить этот файл в базу данных, чтобы иметь возможность его централизованно изменять без перекомпиляции Invoke Workflow.
В настоящее время я использую этот код:
var xamlSchemaContext = new XamlSchemaContext(GetWFAssemblies());
var xmlReaderSettings = new XamlXmlReaderSettings();
xmlReaderSettings.LocalAssembly = typeof(WaitForAnySoundActivity).Assembly;
var xamlReader = ActivityXamlServices.CreateBuilderReader(
new XamlXmlReader(stream, xmlReaderSettings),
xamlSchemaContext);
var activityBuilder = (ActivityBuilder)XamlServices.Load(xamlReader);
var activity = activityBuilder.Implementation;
var validationResult = ActivityValidationServices.Validate(activity);
Это дает мне массу ошибок, которые делятся на две категории:
Категория 1:
Типы из моих сборок неизвестны, хотя я предоставил правильные сборки конструктору XamlSchemaContext
.
ValidationError {Message = Ошибка компилятора встречается с выражением обработки "GreetingActivationResult.WrongPin". "GreetingActivationResult" не объявлен. Он может быть недоступен из-за его уровня защиты., Source = 10: VisualBasicValue, PropertyName =, IsWarning = False}
Это можно решить, используя описанный метод здесь, который в основном добавляет сборки и пространства имен всех используемых типов к экземпляру VisualBasicSettings
:
var settings = new VisualBasicSettings();
settings.ImportReferences.Add(new VisualBasicImportReference
{
Assembly = typeof(GreetingActivationResult).Assembly.GetName().Name,
Import = typeof(GreetingActivationResult).Namespace
});
// ...
VisualBasic.SetSettings(activity, settings);
// ... Validate here
Это работает, но делает всю "динамическую загрузку" части Workflow шуткой, поскольку код все еще должен знать все используемые пространства имен.
Вопрос 1: Есть ли другой способ избавиться от этих ошибок проверки без необходимости заранее знать, какие пространства имен и сборки используются?
Категория 2:
Все мои входные аргументы неизвестны. Я могу видеть их просто отлично в activityBuilder.Properties
, но я все еще получаю ошибки проверки, говоря, что они неизвестны:
ValidationError {Message = ошибка компилятора, с которой встречается выражение обработки "Штырь". "Pin" не объявлен. Он может быть недоступен из-за его уровня защиты., Source = 61: VisualBasicValue, PropertyName =, IsWarning = False}
Пока нет решения.
Вопрос 2: Как сообщить WF4 использовать аргументы, определенные в файле XAML?