RuleSetDialog и ссылочные сборки - PullRequest
0 голосов
/ 12 января 2012

Я пытаюсь открыть форму RuleSetDialog на производственном сайте, но она вылетает с сообщением:

FileNotFoundException: Could not load file or assembly 'IBM.Data.Informix, Version=9.0.0.2, Culture=neutral, PublicKeyToken=7c307b91aa13d208' or one of its dependencies. The system cannot find the file specified.

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

Это трассировка стека:

at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.Load(AssemblyName assemblyRef)
at System.Workflow.Activities.Rules.SimpleRunTimeTypeProvider.get_ReferencedAssemblies()
at System.Workflow.Activities.Rules.SimpleRunTimeTypeProvider.GetTypes()
at System.Workflow.Activities.Rules.Parser..ctor(RuleValidation validation)
at System.Workflow.Activities.Rules.Design.RuleSetDialog..ctor(Type activityType, ITypeProvider typeProvider, RuleSet ruleSet)

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

Ответы [ 2 ]

1 голос
/ 27 октября 2014

Я столкнулся с подобной ошибкой на этой неделе, потому что наши необходимые библиотеки DLL развернуты не в основной папке приложения, а в отдельной подпапке.Я не нашел никакого способа сообщить RuleEngine, где их искать.Взлом в AppDomain не показался мне лучшим решением.

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

Поэтому мой обходной путь - сообщить механизму правил, что ссылочных сборок нет.Это я сделал, написав собственный ITypeProvider и передав его конструктору RuleEngine / RuleSetDialog.

Я взял код из стандартного SimpleRunTimeTypeProvider из github (https://github.com/rashiph/DecompliedDotNetLibraries/blob/master/System.Workflow.Activities/System/Workflow/Activities/Rules/SimpleRunTimeTypeProvider.cs) и адаптировал свойство ReferencedAssemblies (прокомментировал 4 LOC) следующим образом:

    public ICollection<Assembly> ReferencedAssemblies
    {
        get
        {
            if (this.references == null)
            {
                List<Assembly> list = new List<Assembly>();
                // ADAPTATION TO ORIGINAL SOURCE: tell the RuleEngine that there are no referenced assemblies and hence no Extension Methods
                //foreach (AssemblyName name in this.root.GetReferencedAssemblies())
                //{
                //    list.Add(Assembly.Load(name));
                //}
                this.references = list;
            }
            return this.references;
        }
    }
1 голос
/ 20 октября 2012

Не думаю, что это самое правильное решение, но я мог бы заставить его работать, добавив это в свое приложение:

var currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += (o, args) =>
{
     // I resolve the not found assemblies here.
}

Надеюсь, это кому-нибудь поможет.

...