我正在尝试将.NET程序集部署到SQL Server 2008 R2数据库,但我只是遇到了这个错误:
部署错误SQL01268:.Net SqlClient数据提供程序:消息6509,级别16,状态31,行1从使用HRESULT 0x80004005从程序集“程序集”收集元数据时发生错误。
现在棘手的部分是我确保框架版本是正确的,我有一个单独的简单CLR数据库项目,我从中添加和测试事情,看看我是否可以隔离问题(我不能)。我甚至编写了一个使用Mono.Cecil
和PEVerify
的工具来确保我遵守适用于数据库中CLR项目的编程模型限制。我显然错过了一些东西,但我不知道如何调试这个,为什么SQL Server不能告诉我它失败的原因?
为了获得更详细的输出,为什么SQL Server拒绝汇编,我能做些什么呢?
答案 0 :(得分:1)
可以粘贴CREATE DDL语句吗?你自己写了CREATE语句吗?看起来您可能已经使用了Visual Studio中的自动部署。手动尝试。 请详细说明组装,是否可以访问外部数据?
答案 1 :(得分:0)
经过两天的调试,这就是我所做的。
根据经验,我使用Cecil重写程序集,通过简单地用throw new NotImplementedException
忽略所有构造函数替换所有方法体来取消方法(初始化有点棘手,只是不能杀死方法体构造函数)。执行此操作后,程序集已成功安装。我不知道问题是什么,但我知道它与代码有关。这一直是我的假设。
为了找到实际的方法,我使用了二进制搜索。我替换了程序集中的一半方法,如果错误不存在,我就向左走,否则只要我遇到问题,直到找到导致错误的最小方法集。鉴于它超过2000种方法,我花了大约1-2秒来测试每个配置,它节省了大量时间。
我设法将一个方法简单地归为零,这就是(从我可以看出我的发现,这也必须在一个通用类中)。
class Hashtable<K, V>
{
IEnumerable<KeyValuePair<K, V>> GetEnumerator()
{
var hashtable = new Hashtable();
return hashtable
.Cast<DictionaryEntry>()
.Select(x => new KeyValuePair<K, V>((K)x.Key, (V)x.Value))
.GetEnumerator();
}
}
即使编译器应用了大量转换,此代码中的任何内容都不会导致任何IL无效。如果将它放在数据库CLR程序集中,它将拒绝程序集access denied
错误而没有任何进一步的信息。
最终,我要将此作为Microsoft的错误提交,错误消息不应该是access denied
,而且此代码实际上是允许的,因为它不会执行任何不允许的安全保护许可集。