В Microsoft .NET Framework произошла ошибка при попытке загрузить сборку с идентификатором 65675

#c# #.net #winforms #dll

#c# #.net #winforms #dll

Вопрос:

Я должен работать над существующим приложением, состоящим из множества проектов, включая проект базы данных. В проекте statup, который является приложением Windows., при вызове Adapter.Fill(dataTable); появляется пугающая ошибка, в которой говорится, что:

 An error occurred in the Microsoft .NET Framework while trying to load assembly id 65675. The server may be running out of resources, or the assembly may not be trusted with PERMISSION_SET = EXTERNAL_ACCESS or UNSAFE. Run the query again, or check documentation to see how to solve the assembly trust issues. For more information about this error: 
System.IO.FileLoadException: Could not load file or assembly 'xxxxx.yyyy.database, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)
System.IO.FileLoadException: 
   at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMarkamp; stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
   at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMarkamp; stackMark, Boolean forIntrospection)
   at System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMarkamp; stackMark, Boolean forIntrospection)
   at System.Reflection.Assembly.Load(String assemblyString)
 (.Net SqlClient Data Provider)



   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
   at XXX.YY.Data.dsLandholdingsTableAdapters.LandholdingsTableAdapter.Fill(LandholdingsDataTable dataTable, String IV_LRNO, String SearchField, String SearchVal, Nullable`1 SearchType) in E:ProjectsPPPXXXYYYDatadsLandholdings.Designer.cs:line 5678
   at XXX.YYY.Browse.BrowseLandholdings.btnSearch_Click(Object sender, EventArgs e) in E:ProjectsPPPPXXXXYYYBrowseBrowseLandholdings.cs:line 352
  

После исследования в Интернете я обнаружил, что это может помочь изменить «Уровень разрешений» на вкладке «База данных» моего «Свойства проекта базы данных» с «безопасного» на «Небезопасный» или «Внешний». Свойства проекта Dtabase

Но ошибка все еще появляется после внесения упомянутых изменений!

У кого-нибудь есть какие-либо идеи, почему это происходит?

Заранее приветствуется любая помощь.

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

1. Это исключение исходит из вашего процесса, сохраненного в CLR? Или в приложении WinForms? Есть ли еще трассировка стека, которую вы можете опубликовать? Какие-либо события журнала событий на сервере?

2. Да, я бы сначала посмотрел на повреждение файла и проверил на другом компьютере.

3. Вы также должны зарегистрировать все зависимости.

4. @HansPassant,@VladimirPerevalov : попробовал на другой машине, та же проблема!

5. Может оказаться полезным средство просмотра журнала Fusion. Это может дать вам более подробную информацию о том, почему сборка не загружается: msdn.microsoft.com/en-us/library/e74a18c4 (v =vs.71).aspx

Ответ №1:

Это помогло мне:

 USE <DATABASE>;
EXEC sp_configure 'clr enabled' ,1
GO

RECONFIGURE
GO
EXEC sp_configure 'clr enabled'   -- make sure it took
GO

USE <DATABASE>
GO

EXEC sp_changedbowner 'sa'
USE <DATABASE>
GO

ALTER DATABASE <DATABASE> SET TRUSTWORTHY ON;  
  

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

1. Идеально! Проблема возникла при создании базы данных путем восстановления резервной копии, созданной на другом сервере

2.Если это происходит в SQL Server 2017, еще одной проблемой является неподписанная сборка. Правильное исправление: подпишите его. Быстрый взлом: sp_configure 'clr strict security', 0 (на уровне сервера) перед set trustworthy on .

Ответ №2:

У меня это сработало

 EXEC sp_configure 'show advanced options', '1';
GO
RECONFIGURE;
GO

--Enable CLR (.NET Common Language Runtime)
exec sp_configure 'clr enabled', '1';
GO
RECONFIGURE;
GO
--Enable xp_CmdShell stored procedure to run Command Line programs from within T-SQL
--EXEC sp_configure 'xp_cmdshell', 1
--GO

EXEC sp_configure 'show advanced options', '0';
GO
RECONFIGURE;


 /****this is another one****/
USE master
GO
ALTER DATABASE <DB_NAME>SET TRUSTWORTHY ON

USE <DB_NAME>
GO
EXEC sp_changedbowner 'sa'
/****when error occured relating to m,emory***/ 
  

Ответ №3:

Наконец-то я смог это исправить,

  1. Включите «Интеграцию с CLR» в SQL server.
  2. Разверните объект CLR, которым в моем случае был проект базы данных, и я также установил уровень разрешений на внешний.

Спасибо за все комментарии / ответы.

Ответ №4:

Трассировка стека указывает на сборку, которую не удалось загрузить. Если вы используете .dll-файлы для сборки или загрузки чего-либо (импорт / экспорт данных), вы можете захотеть начать с этого.

Убедитесь, что сборка является правильной версией для вашего приложения или что она вообще существует в каталоге.

Кроме того, дважды проверьте соглашение об именовании в сборке. Трассировка стека показывает, что имя сборки или кодовая база недопустимы. Можно ли анализировать язык в вашем приложении? Есть ли опечатка в названии?

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

Ответ №5:

Убедитесь, что сборка, которую вы используете, xxxxx.гггг.сборка базы данных из не предназначена для более старой версии .NET Framework.

Ответ №6:

Для пользователей SQL Server 16 или выше, которые хотят использовать надежные сборки и поддерживать включенную систему строгой безопасности clr, вот шаги, которые сработали для меня:

  1. Удалите свои проблемные сборки, которые не работают (если я не сделал этого первым, следующие шаги не сработали) DROP ASSEMBLY [YourAssembly]
  2. Запустите изменения конфигурации:
 USE [YourDatabase]
EXEC sp_configure 'clr enabled', '1'
EXEC sp_configure 'show advanced options', '1'
EXEC sp_configure 'clr strict security', '1' --we want to use strict security
RECONFIGURE
  
  1. Добавьте свои сборки
 USE [YourDatabase]
CREATE ASSEMBLY [YourAssembly] ...
  

Здесь может возникнуть ошибка, связанная с разрешениями владельца базы данных. Мы хотим установить владельца основной базы данных таким же, как у целевой базы данных.

 The database owner SID recorded in the master database differs from the database owner SID recorded in database. 
  
 USE [YourDatabase]
DECLARE @serverOwner VARCHAR(MAX)
SELECT serverOwner  = suser_sname( owner_sid ) FROM sys.databases WHERE name = 'master'
exec sp_changedbowner @serverOwner
  

Затем повторно запустите сценарий создания сборки.

  1. Добавьте доверенную сборку
 USE [YourDatabase]
declare
     @hash binary(64)
    ,@description nvarchar(4000)

select
      @hash = HASHBYTES('SHA2_512', af.content)
    , @description = a.clr_name
FROM sys.assemblies a
JOIN sys.assembly_files af
    ON a.assembly_id = af.assembly_id
WHERE a.is_user_defined = 1 AND
    af.name = 'YourAssembly'

EXEC sys.sp_add_trusted_assembly
     @hash
    ,@description