MethodAccessException с использованием dll объединенного объекта управления сервером (SMO)

В настоящее время я использую объекты SMO для чтения свойств сервера, базы данных и таблицы SQL-сервера. Такие свойства, как версия, дата установки, размер и т. Д. Клиентский компьютер (их будет несколько) будет обращаться к серверу удаленно, но не будет иметь доступа к библиотекам SMO. По этой причине меня попросили объединить файлы dll в dll-носитель, который должен быть развернут на клиентском компьютере. Я больше не могу контролировать, какие программы там установлены.

Когда код не выполняется, я не получаю ошибок от объединенной библиотеки DLL, но когда она запускается, я получаю исключение доступа к методу (см. Ниже).

Мой вопрос таков: можно ли объединить библиотеки DLL SMO в одну и сохранить функциональность, или я отказываюсь добавлять библиотеки по отдельности. Или есть лучший способ предоставить клиентскому компьютеру доступ к функциям SMO?

Меня беспокоит, что, возможно, невозможно объединить файлы SMO dll в проект, и необходимо принять другое решение, но мы очень ценим любые идеи по решению моей проблемы.

Я использую 32-битные библиотеки SMO.

Сообщение об исключении:

Attempt by method 'Microsoft.SqlServer.Management.Sdk.Sfc.ObjectLoadInfoManager.LoadHierarchy()' to access method 'Microsoft.SqlServer.Smo.UnSafeInternals.ManagementUtil.EnterMonitor(System.Object)' failed.

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

at Microsoft.SqlServer.Management.Sdk.Sfc.ObjectLoadInfoManager.LoadHierarchy() in DummyClass.cs:line0 
at Microsoft.SqlServer.Management.Sdk.Sfc.ObjectLoadInfoManager.GetFirstObjectLoadInfo(Urn urn, Object ci) in DummyClass.cs:line0 
at Microsoft.SqlServer.Management.Sdk.Sfc.ObjectCache.LoadFirstElementVersionless(Urn urn, Object ci) in DummyClass.cs:line0
at Microsoft.SqlServer.Management.Sdk.Sfc.Environment.GetServerVersion(Urn urn, Object ci) in DummyClass.cs:line0
at Microsoft.SqlServer.Management.Sdk.Sfc.Environment.GetObjectInfo(Object ci, RequestObjectInfo req) in DummyClass.cs:line0
at Microsoft.SqlServer.Management.Sdk.Sfc.Enumerator.GetObjectInfo(Object connectionInfo, RequestObjectInfo requestObjectInfo) in DummyClass.cs:line0
at Microsoft.SqlServer.Management.Sdk.Sfc.Enumerator.FixPropertyList(Object connectionInfo, Urn urn, String[] fields, RequestFieldsTypes requestFieldsType) in DummyClass.cs:line0
at Microsoft.SqlServer.Management.Sdk.Sfc.Enumerator.GetData(Object connectionInfo, Request request) in DummyClass.cs:line0
at Microsoft.SqlServer.Management.Smo.ExecutionManager.GetEnumeratorDataReader(Request req) in DummyClass.cs:line0
at Microsoft.SqlServer.Management.Smo.SqlSmoObject.GetInitDataReader(String[] fields, OrderBy[] orderby) in DummyClass.cs:line0
at Microsoft.SqlServer.Management.Smo.SqlSmoObject.ImplInitialize(String[] fields, OrderBy[] orderby) in DummyClass.cs:line0
at Microsoft.SqlServer.Management.Smo.SqlSmoObject.Initialize(Boolean allProperties) in DummyClass.cs:line0
at Microsoft.SqlServer.Management.Smo.SqlSmoObject.OnPropertyMissing(String propname, Boolean useDefaultValue) in DummyClass.cs:line0
at Microsoft.SqlServer.Management.Smo.PropertyCollection.RetrieveProperty(Int32 index, Boolean useDefaultOnMissingValue) in DummyClass.cs:line0
at Microsoft.SqlServer.Management.Smo.PropertyCollection.GetValueWithNullReplacement(String propertyName, Boolean throwOnNullValue, Boolean useDefaultOnMissingValue) in DummyClass.cs:line0
at Microsoft.SqlServer.Management.Smo.PropertyCollection.GetValueWithNullReplacement(String propertyName) in DummyClass.cs:line0
at Microsoft.SqlServer.Management.Smo.Server.get_NetName() in DummyClass.cs:line0
at DummyLibrary.someclass.GetNetName() in DummyClass.cs:line0
at DummyLibrary.someotherclass.GatherSQLBlaBla(YetAnotherClass classvariable, List`1 customerErrorMessages) in DummyClass.cs:line0
at DummyLibrary.StillAnotherClass.GetTheStuff(String stringvar, Int64 aninteger) in DummyClass.cs:line0
at DummyProgram.Main(String[] args) in hubbabubba.Program.cs:line 37
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

Моя строка слияния:

"$(SolutionDir)packages\ILMerge.2.13.0307\ILMerge.exe" /log:log.txt /target:library /closed /out:"$(ProjectDir)bin\$(Configuration)\DummyOutPut.dll"  "$(ProjectDir)bin\$(Configuration)\DummyInput.dll"  "$(ProjectDir)SmoDll\Microsoft.SqlServer.Smo.dll" "$(ProjectDir)SmoDll\Microsoft.SqlServer.SqlEnum.dll" "$(ProjectDir)SmoDll\Microsoft.SqlServer.ConnectionInfo.dll" "$(ProjectDir)SmoDll\Microsoft.SqlServer.Management.Sdk.Sfc.dll" "DummyPath\log4net.dll"

Если библиотеки DLL не объединяются, а упоминаются как внешние библиотеки DLL, ошибок не возникает. Я нашел эту тревожную строку в журнале ilmerge:

Duplicate type name: modifying name of the type 'AssemblyVersionInfo' (from assembly 'Microsoft.SqlServer.Management.Sdk.Sfc') to 'Microsoft.SqlServer.Management.Sdk.Sfc1173.AssemblyVersionInfo'

person martijn    schedule 02.06.2015    source источник


Ответы (1)


Прежде чем вы сможете использовать библиотеку объектов SMO, также необходима библиотека «Системные типы CLR Microsoft SQL Server». У нас были изменения в плане, и сейчас мы выполняем предварительную установку двух файлов msi.

person martijn    schedule 02.06.2015