#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);
Код работает нормально, но во время развертывания возникает несколько проблем с разрешениями.
- При запуске пакета из DataTools происходит сбой пакета, поскольку не удается найти файл. Если я выполнил DataTools как администратор, работает. Тем не менее, я не понимаю, как пользователь я должен иметь возможность просматривать файл.
- При запуске пакета из 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
- Пользовательский интерфейс будет ссылаться на локальную DLL, поскольку существует в папке bin
- SSIS будет ссылаться на библиотеку DLL GAC из-за загрузки из GAC, которая ссылается на файл db из локальной папки
Использование локального (проблемного)
- Пользовательский интерфейс будет ссылаться на локальную DLL, поскольку существует в папке bin
- 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 на диске. Но в любом случае было бы неплохо узнать, почему загрузка с диска так подвержена ошибкам.