В настоящее время я использую объекты 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'