2015-01-07 2 views
1

SQL에서 어셈블리를 만들려고하는데 다음 DLL을로드 할 수 없습니다. SQL에서 'System.ServiceModel.Internals'어셈블리를 만들지 못했습니다.

create assembly [system.servicemodel.internals] 
from 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.ServiceModel.Internals.dll' 
with permission_set = safe; 
go 

System.ServiceModel.Internals

내가이 오류 :

Msg 6218, Level 16, State 2, Line 2 CREATE ASSEMBLY for assembly 'System.ServiceModel.Internals' failed because assembly 'System.ServiceModel.Internals' failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database. CLR Verifier error messages if any will follow this message [ : System.Runtime.IOThreadScheduler+ScheduledOverlapped::.ctor][mdToken=0x6000185][offset 0x00000023][found unmanaged pointer][expected unmanaged pointer] Unexpected type on the stack. [ : System.Runtime.IOThreadScheduler+ScheduledOverlapped::Post][mdToken=0x6000183][offset 0x0000000D][found unmanaged pointer][expected unmanaged pointer] Unexpected type on the stack. [ : System.Runtime.IOThreadScheduler+ScheduledOverlapped::Cleanup][mdToken=0x6000184][offset 0x00000019][found unmanaged pointer][expected unmanaged pointer] Unexpected type on the stack. [ : System.Runtime.Diagnostics.DiagnosticsEventProvider::WriteMessageEvent][mdToken=0x6000357][offset 0x0000004B][found ref 'System.String'] Expected numeric type on the stack. [ : System.Runtime.Diagnostics.DiagnosticsEventProvider::WriteEvent][mdToken=0x6000359][offset 0x0000012B] Instruction cannot be verified. [ : System.Runtime.Diagnostics.DiagnosticsEventProvider::WriteEvent][mdToken=0x6000359][offset 0x0000003F] Instruction cannot be verified. [ : System.Runtime.Diagnostics.DiagnosticsEventProvider::WriteEvent][mdToken=0x600035a][offset 0x00000061][found ref 'System.String'] Expected numeric type on the stack. [ : System.Runtime.Diagnostics.DiagnosticsEventProvider::WriteEvent][mdToken=0x600035b][offset 0x0000001F][found unmanaged pointer][expected unmanaged pointer] Unexpected type on the stack. [ : System.Runtime.Diagnostics.DiagnosticsEventProvider::WriteTransferEvent][mdToken=0x600035c][offset 0x0000007C] Instruction cannot be verified. [ : System.Runtime.Diagnostics.DiagnosticsEventProvider::WriteTransferEvent][mdToken=0x600035c][offset 0x000002F4][found Native Int][expected unmanaged pointer] Unexpected type on the stack. [...

내가 (거의 100 % 유사)이 해결 질문을했다 Failed to CREATE AN ASSEMBLY in SQL 그래서 같은

닷넷을하려고 노력 버전의 SQL Server 및 파일이 동일 v4.0.30319

enter image description here

나는 select * from sys.dm_clr_properties 문을 실행했는데 결과가 정상적으로 보입니다.

directory C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ 
version v4.0.30319 
state CLR is initialized 

SQL 버전 : 어떻게 어셈블리를 만드는 방법 11.2.5058.0

어떤 생각?

Assembly 'DataLoader' references assembly 'system.servicemodel.internals, version=4.0.0.0, culture=neutral, publickeytoken=31bf3856ad364e35.', which is not present in the current database. SQL Server attempted to locate and automatically load the referenced assembly from the same location where referring assembly came from, but that operation has failed (reason: 2(The system cannot find the file specified.)). Please load the referenced assembly into the current database and retry your request.

+1

blacai이 행운? 지금까지 동일한 문제가 발생했습니다 – jaxxbo

+0

작업량으로 인해 제공된 솔루션을 테스트 할 수 없습니다. 확인해도 대답이 – blfuentes

+1

@blacai로 표시됩니다. David Manning의 대답이 올바른지 확인할 수 있습니다. 단순히 SAFE 대신 UNSAFE의 PERMISSION_SET을 사용하기 만하면됩니다. 확실히 SQL Server 2012를 실행하고 위에서 만든 CREATE ASSEMBLY 코드를 복사하고 실행 한 다음 오류를 확인하고 '안전'을 'UNSAFE'로 변경하고 다시 실행하여 작동했습니다. –

답변

3

UNSAFE 권한 집합 옵션을 사용하여 어셈블리를 설치하려고 시도 했습니까?

SQL Server 11.0.5058에 UNSAFE로 설치된 System.ServiceModel.Internals (G4의 v4)이 있습니다. 버전 관련 문제도 있을지 모르겠지만 다음과 같은 경우에만 어셈블리를 설치할 수 있다고 생각합니다. 관리되지 않는 리소스에 액세스 할 수 있으므로 안전하지 않습니다. 귀하의 오류 메시지에서

: 스택에

[발견되지 않는 포인터] [예상되지 않는 포인터] 예기치 않은 유형입니다.

예상 된 비 관리 포인터, 비 관리 포인터 발견, 비 관리 포인터가 허용되지 않음으로 알고 있습니다.

권한 집합의 정의는 https://msdn.microsoft.com/en-us/library/ms189566.aspx을 참조하십시오.

+1

버전 문제입니다. everything.exe를 사용하여 모든 system.servicemodel.internals.dll을 검색 한 다음 SQL Server의 clr 버전과 일치하는 DLL을 선택하고 예 (UNSAFE)로 표시해야합니다. – jaxxbo

2
[found ref 'System.String'] Expected numeric type on the stack 

는 스택 추적이 이야기를 알려줍니다, CLR은 검증 스택을 확인하고 예상치 못한 발견 : 나는이 오류가있어 사용자 지정 어셈블리를 만들려고 할 때 때문에

나는 필요 숫자 대신 문자열을 입력하십시오. 그것은 꽤 나쁘다. 관련 메서드가 실행 중일 때 스택 추적이 완전하지 않아서 추적 할 수 없으므로 System.Runtime.Diagnostics.DiagnosticsEventProvider.WriteTransferEvent()입니다.

.NET Framework의 .NET 4 추가 버전으로, ETW (Windows 용 이벤트 추적)를 지원합니다. 디스어셈블러는 여러 레이어를 통해 코드에서 사용하는 코드를 보여줄 수 있습니다. 예를 들어 System.ServiceModel.Channels.HttpRequestContext.TraceHttpMessageReceived()가이를 호출합니다.

즉, 우리는 WCF 토지에 단단히 있으며 HTTP를 통해 메시지를 수신하고 ETW 이벤트를 생성하므로 ETW 도구로 추적 할 수 있습니다. 핵심 WCF 어셈블리 인 System.ServiceModel.dll에서 시작된 호출 인 ETW 추적 코드는 System.ServiceModel.Internals.dll에 있습니다.

SQL Server 컴퓨터에는 이러한 WCF 어셈블리의 두 가지 버전이 있으므로 어쨌든, 문제의 본질을 고려할 때 어떻게 이런 일이 발생할 수 있는지에 대한 결론을 내릴 수 있습니다. 그들은 보통 쌍으로 배포되며 기본 .NET 설치의 일부입니다. .NET 4.0 RTM, 4.01, 4.02, 4.03 버전이 Windows Update를 통해 슬립 스트리밍 된 이후로 많은 개정이있었습니다. 이러한 업데이트는 특히 System.ServiceModel에 영향을줍니다. 그 이후로 출시 된 버전 4.5, 4.5.1, 4.5.2 및 4.6과 버그 수정 및 보안 문제 패치를 한 KB 소수의 KB 업데이트에 대해서는 언급하지 않았습니다.

다음 질문을 기다리는 중 : 은 무엇입니까? 수정 버전 : System.ServiceModel.Internals.dll? Microsoft 지원부에 전화를 걸면 "아무 것도 없습니다"라고 알려줍니다. 그러나 당신은 이미 그것을 알고있었습니다. 그러지 마세요.어쨌든이 작업을 수행하려는 경우 기본 전략은 첫 번째의 개정 번호를보고 System.ServiceModel.Internals의 수정 번호가 동일하지 않은 경우 다음을 찾으십시오. 적어도 구장에서. 지금 당신이 가진 것은 거의 확실하지 않습니다. 개정 34234는 대략 .NET 4.5.2 개정 번호입니다.

관련 문제