Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# sp#OACreate返回(0x‭;80131051‬;)SQL 2016 x64,程序集目标为x64_C#_Sql Server_Com - Fatal编程技术网

C# sp#OACreate返回(0x‭;80131051‬;)SQL 2016 x64,程序集目标为x64

C# sp#OACreate返回(0x‭;80131051‬;)SQL 2016 x64,程序集目标为x64,c#,sql-server,com,C#,Sql Server,Com,我知道有很多关于32/64位冲突的问题的答案,但是在这个场景中,所有的事情都安排在64位进程中运行 我正在帮助客户从SQL Server 2008 R2 x64升级到SQL Server 2016 x64上的新实例。 客户有一些旧程序(数百个),它们使用一系列sp_OACreate/Method/Destroy来激活我们的产品COM接口,这些接口以C#编码,并暴露于COM和目标x64。使用RegAsm的x64版本注册,并在GAC中强名称和加载 在我的环境中,我运行了SQL2008R2,所有这些都

我知道有很多关于32/64位冲突的问题的答案,但是在这个场景中,所有的事情都安排在64位进程中运行

我正在帮助客户从SQL Server 2008 R2 x64升级到SQL Server 2016 x64上的新实例。 客户有一些旧程序(数百个),它们使用一系列sp_OACreate/Method/Destroy来激活我们的产品COM接口,这些接口以C#编码,并暴露于COM和目标x64。使用RegAsm的x64版本注册,并在GAC中强名称和加载

在我的环境中,我运行了SQL2008R2,所有这些都可以正常工作。我安装了SQL 2016,并重新发布了该问题

(我知道最好使用不同的方法,但是他们不愿意改变事情,因为使用这种方法的地方有数百个。)

我还测试了在VB脚本中创建该对象,效果与预期一致。能够在64位进程中运行VBScript并调用
CreateObject

EXEC@hr=sp_OACreate'Satori64.cassttask',@TaskObject OUT,4
EXEC sp_OAGetErrorInfo@TaskObject、@ErrorSource out、@ErrorDescription out
ErrorSource=“ODSOLE扩展过程”
ErrorDescription=“类未注册”
hr=“-2147221164”(‭80040154‬)

EXEC@hr=sp_OACreate'Satori64.cassttask',@TaskObject OUT,1
EXEC sp_OAGetErrorInfo@TaskObject、@ErrorSource out、@ErrorDescription out
ErrorSource=“ODSOLE扩展过程”
ErrorDescription=“”
hr=“-2146234287”(‭80131051‬)
在做了更多的研究并查看了procmon日志之后,我发现SQLServer查找COM对象的方式与vbscript查找和加载COM对象的方式大不相同

由于一些评论,我深入查看了procmon日志,以了解可能发生的情况。在SQL 2008 R2和2016之间,文件和注册表访问是类似的。2008日志显示程序集已加载,并且找到并创建了预期的对象。2016日志显示它能够找到程序集,但随后意外地立即失败虽然这有帮助,但它并没有回答出问题所在

因此,我深入研究了一下,看看是否可以找到为什么程序集没有加载

我补充说:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion]
"LogFailures"=dword:00000001
"ForceLog"=dword:00000001
"LogPath"="C:\\Temp\\Fusion\\"
并查看了两个版本的日志:

成功的SQL R2 2008

*** Assembly Binder Log Entry  (11/18/2019 @ 10:06:54 PM) ***

The operation was successful.
Bind result: hr = 0x0. The operation completed successfully.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable  C:\Program Files\Microsoft SQL Server 2008\MSSQL10_50.MSSQL2008\MSSQL\Binn\sqlservr.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: DisplayName = Satori64, Version=4.7.1.1, Culture=neutral, PublicKeyToken=ac6bbd3b7853cfdf
 (Fully-specified)
LOG: Appbase = file:///C:/Program Files/Microsoft SQL Server 2008/MSSQL10_50.MSSQL2008/MSSQL/Binn/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = sqlservr.exe
Calling assembly : (Unknown).
===
LOG: This bind starts in default load context.
LOG: Download of application configuration file was attempted from file:///C:/Program Files/Microsoft SQL Server 2008/MSSQL10_50.MSSQL2008/MSSQL/Binn/sqlservr.exe.config.
LOG: Configuration file C:\Program Files\Microsoft SQL Server 2008\MSSQL10_50.MSSQL2008\MSSQL\Binn\sqlservr.exe.config does not exist.
LOG: No application configuration file found.
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Post-policy reference: Satori64, Version=4.7.1.1, Culture=neutral, PublicKeyToken=ac6bbd3b7853cfdf
LOG: Found assembly by looking in the GAC.
LOG: Binding succeeds. Returns assembly from C:\windows\Microsoft.Net\assembly\GAC_64\Satori64\v4.0_4.7.1.1__ac6bbd3b7853cfdf\Satori64.dll.
LOG: Assembly is loaded in default load context.
SQL 2016不成功

*** Assembly Binder Log Entry  (11/18/2019 @ 10:08:37 PM) ***

The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable  C:\Program Files\Microsoft SQL Server\MSSQL13.SQLSERVER\MSSQL\Binn\sqlservr.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: DisplayName = Satori64, Version=4.7.1.1, Culture=neutral, PublicKeyToken=ac6bbd3b7853cfdf
 (Fully-specified)
LOG: Appbase = file:///C:/Program Files/Microsoft SQL Server/MSSQL13.SQLSERVER/MSSQL/Binn/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = sqlservr.exe
Calling assembly : (Unknown).
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Program Files\Microsoft SQL Server\MSSQL13.SQLSERVER\MSSQL\Binn\sqlservr.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Post-policy reference: Satori64, Version=4.7.1.1, Culture=neutral, PublicKeyToken=ac6bbd3b7853cfdf
LOG: Fusion is hosted. Check host about this assembly.
LOG: Assembly is not in CLR Loaded list. Asking host assembly store.
LOG: Try host assembly store with assembly satori64, version=4.7.1.1, culture=neutral, publickeytoken=ac6bbd3b7853cfdf, processorarchitecture=amd64.
LOG: Try host assembly store with assembly satori64, version=4.7.1.1, culture=neutral, publickeytoken=ac6bbd3b7853cfdf, processorarchitecture=msil.
LOG: Try host assembly store with assembly satori64, version=4.7.1.1, culture=neutral, publickeytoken=ac6bbd3b7853cfdf.
WRN: Host assembly store does not contain this assembly.
ERR: Unrecoverable error occurred during pre-download check (hr = 0x80070002).
在这里,我有点不知所措。SQL可以加载程序集,但由于某些原因,在通过COM访问它时不能加载

我决定从头开始,创建一个具有绝对最小引用的新程序集,一个具有单个方法的单个类。 我强烈地命名它,在RegAsm(x64)注册,并将其加载到GAC

这显示了完全相同的结果。sp_OACreate在2008 R2中工作,没有问题。在2014年和2016年失败


如果您有任何想法,我们将不胜感激!

我希望您在执行此操作时使用ProcMon查看注册表访问,以查看它在查找什么?您可以使用诸如sysinternals的ProcMon之类的工具来检查所使用的注册表项(您也可以与您的vbs程序进行比较)。按.exe名称筛选。