Visual studio 2010 使用程序集字节字符串在SQLCLR中创建程序集失败,因为它无法打开物理文件

Visual studio 2010 使用程序集字节字符串在SQLCLR中创建程序集失败,因为它无法打开物理文件,visual-studio-2010,unit-testing,sql-server-2008-r2,sqlclr,Visual Studio 2010,Unit Testing,Sql Server 2008 R2,Sqlclr,我正在尝试添加到SQLServer2008数据库,该数据库的架构在我的VisualStudio2010解决方案文件中定义。这个自定义聚合的代码存在于同一个解决方案中的SQLCLR项目中,但是我很难通过单元测试。对于这个项目的单元测试,我使用了一种类似于获取程序集字节字符串的方法。测试套件或生成后事件每次都需要自动更新我的脚本以创建程序集,因为在任何类型的MSBuild(从命令行或Visual Studio)之后,程序集位都会发生更改 脚本似乎正在更新其程序集位字符串,以正确匹配每次运行的当前程序

我正在尝试添加到SQLServer2008数据库,该数据库的架构在我的VisualStudio2010解决方案文件中定义。这个自定义聚合的代码存在于同一个解决方案中的SQLCLR项目中,但是我很难通过单元测试。对于这个项目的单元测试,我使用了一种类似于获取程序集字节字符串的方法。测试套件或生成后事件每次都需要自动更新我的脚本以创建程序集,因为在任何类型的MSBuild(从命令行或Visual Studio)之后,程序集位都会发生更改

脚本似乎正在更新其程序集位字符串,以正确匹配每次运行的当前程序集位。但是单元测试仍然失败,底层SQLException说,“创建程序集失败,因为它无法打开物理文件“0xDEADBEEF”:3(系统无法找到指定的路径)。(我已从该消息中删除了真正的程序集位。)当汇编位看起来正确时,为什么会出现此错误?我应该如何修复此错误

实际程序集位字符串的长度约为16 KB。这会有问题吗?CREATE assembly需要整个程序集的位还是只需要一个标头,如何仅获取标头

我们已经有了部署该数据库的单元测试基础设施,包括运行部署前和部署后脚本。我们还拥有用户定义函数和聚合所需的授权设置

以下是我的部署后脚本:

IF EXISTS (SELECT name FROM sys.assemblies WHERE name = 'foo')
   DROP ASSEMBLY foo
go

-- The assembly bits change after every build from the command line or Visual Studio.  
-- This variable needs to change each time the foo assembly changes.
declare @assemblyBits as varchar(max)
-- This string is really about 15000 characters, including some newlines which are removed
-- in the next block.  Word-wrapping this line or not word-wrapping it seems to have no 
-- effect.
set @assemblyBits = '0x42'

-- Trim whitespace from assembly bits.
declare @sanitizedBits as varchar(max)
set @sanitizedBits = Replace(Replace(Replace(@assemblyBits, Char(10), ''), Char(13), ''), Char(9), '')

CREATE ASSEMBLY foo
AUTHORIZATION bar
from @sanitizedBits 
GO

IF EXISTS (SELECT name FROM sysobjects WHERE name = 'Product')
   DROP AGGREGATE Product
go

CREATE AGGREGATE [Aggregations].[Product]
    (@value float,
    @weight float)
    RETURNS float
    EXTERNAL NAME foo.[foo.Product]
go

如果内容是字符串,请使用动态sql

    EXEC ('CREATE ASSEMBLY foo AUTHORIZATION bar from ' + @sanitizedBits )

通常,如果您将内容作为字符串,则使用动态sql传递
varbinary

    EXEC ('CREATE ASSEMBLY foo AUTHORIZATION bar from ' + @sanitizedBits )

通常,您传入一个
varbinary

尝试在托管数据库的远程服务器上执行创建程序集代码。这应该可以解决问题。

尝试在托管数据库的远程服务器上执行创建程序集代码。这应该可以解决问题。

是,将varchar变量更改为varbinary工作了。谢谢!是的,将varchar变量更改为varbinary工作了。谢谢!