Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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
.net SQL Server自定义CLR失败,错误为“0”;无法加载文件或程序集或其依赖项之一。系统找不到指定的文件;_.net_Sql Server_Sql Server 2012_Sqlclr - Fatal编程技术网

.net SQL Server自定义CLR失败,错误为“0”;无法加载文件或程序集或其依赖项之一。系统找不到指定的文件;

.net SQL Server自定义CLR失败,错误为“0”;无法加载文件或程序集或其依赖项之一。系统找不到指定的文件;,.net,sql-server,sql-server-2012,sqlclr,.net,Sql Server,Sql Server 2012,Sqlclr,我已经创建了一个引用Windows DLL WindowsBase的SQL CLR。在大多数情况下,我的CLR工作正常,但如果WindowsBase在GAC中得到更新,则会出现错误“主机存储中的程序集与GAC中的程序集具有不同的签名。” 为了解决这个问题,我构建了我的CLR以引用一个不在GAC中的WindowsBase版本。现在,当我运行CLR时,出现错误“无法加载文件或程序集'WindowsBase,Version=4.0.0.0,…”或其依赖项之一。系统找不到指定的文件。” 我设置了FusL

我已经创建了一个引用Windows DLL WindowsBase的SQL CLR。在大多数情况下,我的CLR工作正常,但如果WindowsBase在GAC中得到更新,则会出现错误“
主机存储中的程序集与GAC中的程序集具有不同的签名。

为了解决这个问题,我构建了我的CLR以引用一个不在GAC中的WindowsBase版本。现在,当我运行CLR时,出现错误“
无法加载文件或程序集'WindowsBase,Version=4.0.0.0,…”或其依赖项之一。系统找不到指定的文件。

我设置了FusLogVw以查看发生了什么,并获得以下输出

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\MSSQL11.MSSQLSERVER\MSSQL\Binn\sqlservr.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
    LOG: DisplayName = WindowsBase, Version=4.0.0.0
    LOG: Appbase = file:///C:/Program Files/Microsoft SQL Server/MSSQL11.MSSQLSERVER/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: 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: WindowsBase, Version=4.0.0.0
    LOG: The same bind was seen before, and was failed with hr = 0x80070002.
    ERR: Unrecoverable error occurred during pre-download check (hr = 0x80070002).
程序集加载程序似乎正在使用machine.config文件来确定应该在哪里查找程序集。基于这个假设,我更新了machine.config

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
             <assemblyIdentity name="WindowsBase"... />
              <codBase version="4.0.0.0"
                   href="./AdditionalAssemblies/WindowsBase.dll"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>

我尝试过使用相对路径(相对于SQlservr.exe)和绝对路径,但仍然得到上面提到的相同错误。对于如何设置SQL CLR,使其引用GAC之外的WindowsBase副本而不出现上述错误,我们将不胜感激


~Bugz~

SQL Server的CLR主机不支持您尝试执行的操作。SQL Server中的CLR受到高度限制,以防止破坏SQL Server的稳定性,因为它的工作方式与操作系统上运行的应用程序不同。因此,受支持的DLL集非常有限(即,经过验证可以工作,并保证在.NET更新过程中保持工作状态)。WindowsBase不是其中之一,因此您需要手动将其作为
不安全的
加载到SQL Server中。但是,这会使您遇到DLL GAC中的版本(DAC在GAC和SQL Server的CLR主机之间必须是相同版本)的问题,或者更糟的是,如果“混合”(非托管C++和托管代码)都不再是“纯”的。在这种情况下,新版本将不会加载,而旧版本会出现“错误版本”错误,因此您需要做一些工作

有关更多详细信息,请参阅以下文章/文档:

这组链接取自我写的一篇文章的“附加阅读”部分:


有关一般使用SQLCLR的更多信息,请访问我的网站: