Visual studio 2010 使用程序集字节字符串在SQLCLR中创建程序集失败,因为它无法打开物理文件
我正在尝试添加到SQLServer2008数据库,该数据库的架构在我的VisualStudio2010解决方案文件中定义。这个自定义聚合的代码存在于同一个解决方案中的SQLCLR项目中,但是我很难通过单元测试。对于这个项目的单元测试,我使用了一种类似于获取程序集字节字符串的方法。测试套件或生成后事件每次都需要自动更新我的脚本以创建程序集,因为在任何类型的MSBuild(从命令行或Visual Studio)之后,程序集位都会发生更改 脚本似乎正在更新其程序集位字符串,以正确匹配每次运行的当前程序集位。但是单元测试仍然失败,底层SQLException说,“创建程序集失败,因为它无法打开物理文件“0xDEADBEEF”:3(系统无法找到指定的路径)。(我已从该消息中删除了真正的程序集位。)当汇编位看起来正确时,为什么会出现此错误?我应该如何修复此错误 实际程序集位字符串的长度约为16 KB。这会有问题吗?CREATE assembly需要整个程序集的位还是只需要一个标头,如何仅获取标头 我们已经有了部署该数据库的单元测试基础设施,包括运行部署前和部署后脚本。我们还拥有用户定义函数和聚合所需的授权设置 以下是我的部署后脚本: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)之后,程序集位都会发生更改 脚本似乎正在更新其程序集位字符串,以正确匹配每次运行的当前程序
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工作了。谢谢!