Ссылочные разрешения на отражение задачи скрипта SSIS

#c# #dll #ssis #package #sql-agent-job

#c# #dll #ssis #пакет #sql-agent-job

Вопрос:

Я создал программное обеспечение, которое способно автоматически экспортировать пакет DTSX. Этот пакет среди других объектов также имеет ScriptTask (C #). Все они скомпилированы и работают просто отлично.

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

 Assembly clientLib = Assembly.LoadFrom("C:\......\mylibrary.dll");
Type licenseCheckType = clientLib.GetType("myclass");
object instance = Activator.CreateInstance(licenseCheckType);
  

Код работает нормально, но во время развертывания возникает несколько проблем с разрешениями.

  1. При запуске пакета из DataTools происходит сбой пакета, поскольку не удается найти файл. Если я выполнил DataTools как администратор, работает. Тем не менее, я не понимаю, как пользователь я должен иметь возможность просматривать файл.
  2. При запуске пакета из SQLAgent (это важно) происходит сбой пакета. Если я установлю для пользователя службы SQL Agent пользователя «Локальная система» или «Администратор», он будет работать.

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

 Error: Exception has been thrown by the target of an invocation.
  

Реализация механизма загрузки из GAC работает, но я хотел бы изучить другой способ, поскольку в моем случае DLL ссылается на файл LiteDB в системном каталоге, и было бы неплохо иметь их все вместе.

 Assembly clientLib = Assembly.Loadm("mylibrary");
Type licenseCheckType = clientLib.GetType("myclass");
object instance = Activator.CreateInstance(licenseCheckType);
  

В качестве резюме:

Использование GAC

  1. Пользовательский интерфейс будет ссылаться на локальную DLL, поскольку существует в папке bin
  2. SSIS будет ссылаться на библиотеку DLL GAC из-за загрузки из GAC, которая ссылается на файл db из локальной папки

Использование локального (проблемного)

  1. Пользовательский интерфейс будет ссылаться на локальную DLL, поскольку существует в папке bin
  2. SSIS будет ссылаться на локальную DLL из-за загрузки из локальной папки, которая ссылается на файл db из локальной папки

Комментарии:

1. Почему вы загружаете свою сборку из файловой системы — она подвержена ошибкам и проблемам с доступом, как вы сообщали. Вы можете загрузить сборку из GAC Assembly.Load("SampleAssembly, Version=1.0.2004.0, Culture=neutral, PublicKeyToken=8744b20f8da049e3") — необходимо предоставить publickeytoken.

2. Сборка ссылается на другую сборку, которая ссылается на LiteDB, которая не может быть частью GAC.

3. Я могу только предложить использовать SysInternals Process Monitor для мониторинга доступа к вашим библиотекам DLL при получении ошибок доступа. Это может показать, какие разрешения все еще отсутствуют.

4. Конечно, решение, которое мы предоставили, состоит в том, чтобы заставить библиотеку DLL LiteDB использовать путь для доступа к фактическому файлу fb на диске. Но в любом случае было бы неплохо узнать, почему загрузка с диска так подвержена ошибкам.