编辑3.5 (旨在在最后更新中放置下面的第3项,但被忽略了。A。)
查看由于我的问题而导致的程序集注册失败的方法,以及可以从ProcExplorer跟踪中推断出的有限信息,使我对一些事情做出了一些结论。没有解决方案,只有一些推断
1. Microsoft在某些时候希望允许加载Framework 2.0程序集。我做出这样的推论是,如果将它们仅与排除它们的概念绑定(bind)在一起,则通过立即检查程序集的框架元数据,验证可能会失败。失败是与在2008R2中加载4.0程序集相似的-与此相反,它会显示出严重错误和特定错误,请您不要这样做。
2.如果我升级到包含2.0程序集的2008R2数据库,则该程序集将被加载,并且其中的功能将在SQL 2012数据库中触发。因此,非常有能力执行基于2.0的程序集。让它们通过加载程序是窍门-因此,我坚信,发现突然启用CLR中的2.0框架程序集的补丁或SP不会令我感到惊讶。
3. 我相信,通过有意更改或错误,PERMISSION _ SET = UNSAFE所隐含的某些验证语义在SQL2012 中已更改。我的经验使我相信,如果指定了PEVERIFY /MD(不检查诸如非托管指针之类的东西),则SQL Server的CLR Verifier的早期版本执行的功能相当于PERMISSION_SET = UNSAFE,而如果未指定,则等同于PEVERIFY /IL。但是,在我看来,在SQL 2012中,无论UNSAFE权限标志的如何,CLR验证程序都会执行PEVERIFY /IL 。我很想知道是否有人可以验证这个理论*
EDIT2
在继续研究此问题之后,我还没有找到一种解决方案,可以对项目进行改造,以使用Microsoft几年前创建的System.Data.OracleClient提供程序。另外,进一步的研究和电子邮件使我相信,关于SQL 2008R2和SQL 2012之间的程序集验证发生了更改,至少有一个或两个“不包括电池”的通知-这个程序集恰恰指向了这一点。关于SQLCLR程序集注册问题的多篇博客文章导致断言,验证过程没有任何改变,但是在两个数据库之间注册相同的程序集却产生了一个无法解释的问题。我找不到SQLServer如何验证程序集的方法,因此,此刻,我继续在黑暗中继续寻找解决方案……
我们的MS SQL Server数据库中存在一个长期存在的SQLCLR项目,可以对Oracle数据库进行各种关键查询。该项目已经运行了大约六年,已经从SQL 2005中的32位程序集迁移到了MS SQL Server 2008 R2的64位程序集。
尽管MS SQL 2012升级顾问仅指出了有关某些地理类型的SQLCLR迁移的一般性问题,但我还是偷偷摸摸地怀疑这种迁移可能确实有问题。果然,我发现将这个项目迁移到SQL Server 2012时会遇到我所担心的棘手问题。
尝试注册此相同的64位Oracle.DataAccess.dll(2.112.1.0)(现在已经在SQL Server 2008R2(及其祖先)中愉快地生活了一段时间)时,数据库现在建议程序集“验证失败”。 编辑:我一直认为,授予UNSAFE权限的程序集不会通过验证检查。这不正确吗?
错误响应的摘录如下:[ : Oracle.DataAccess.Client.OracleDatabase::Startup][mdToken=0x6000021][offset 0x00000048][found unmanaged pointer][expected readonly address of value 'Oracle.DataAccess.Client.OpoConValCtx'] Unexpected type on the stack.
[ : Oracle.DataAccess.Client.OracleDatabase::Startup][mdToken=0x6000021][offset 0x00000080][found unmanaged pointer][expected unmanaged pointer] Unexpected type on the stack.
[ : Oracle.DataAccess.Client.OracleDatabase::Startup][mdToken=0x6000021][offset 0x000000E3][found unmanaged pointer][expected readonly address of value 'Oracle.DataAccess.Client.OpoConValCtx'] Unexpected type on the stack.
[ : Oracle.DataAccess.Client.OracleDatabase::Startup][mdToken=0x6000021][offset 0x0000011B][found unmanaged pointer][expected unmanaged pointer] Unexpected type on the stack.
[ : Oracle.DataAccess.Client.OracleDatabase::Shutdown][mdToken=0x6000023][offset 0x0000003C][found unmanaged pointer][expected readonly address of value 'Oracle.DataAccess.Client.OpoConValCtx'] Unexpected type on the stack.
[ : Oracle.DataAccess.Client.OracleDatabase::Shutdown][mdToken=0x6000023][offset 0x00000073][found unmanaged pointer][expected unmanaged pointer] Unexpected type on the stack.
[ : Oracle.DataAccess.Client.OracleTransaction::Commit][mdToken=0x600002f][offset 0x0000008F][found unmanaged pointer][expected readonly address of value 'Oracle.DataAccess.Client.OpoTxnValCtx'] Unexpected type on the stack.
[ : Oracle.DataAccess.Client.OracleTransaction::Commit][mdToken=0x600002f][offset 0x000000A6][found unmanaged pointer][expected unmanaged pointer] Unexpected type on the stack.
[ : Oracle.DataAccess.Client.OracleTransaction::Dispose][mdToken=0x6000034][offset 0x0000001E][found unmanaged pointer][expected Native Int] ...
意识到2012年的SQLCLR现在使用.NET 4.0,我认为也许同一DLL的4.0版可能会解决此问题。因此,我下载了ODAC 12.1.0.1的64位版本,该版本提供了该库的4.0特定版本。仍然看到类似(但不完全相同)的程序集创建/验证失败-特别是关于“无法验证的非托管指针类型”。
然后,我尝试使用Oracle.DataAccess(Oracle.ManagedDataAccess)的托管代码版本,并且该程序集依赖于辅助程序集,该程序集由于不是“纯” PE格式程序集而也导致注册失败(后来的研究使我转向认为它不允许将MSIL和汇编语言混合使用)。因此,对我而言,这意味着永远无法在SQLCLR中加载托管代码版本。
因此,在这一点上,我剩下的问题和答案很少。在2005/2008/2008R2和2012年之间的装配验证中,究竟发生了什么变化,现在将阻止给定装配进行验证?是否可以使用任何选项或解决方案来注册Oracle.DataAccess?失败将使项目重新配置/重新定位为.NET 4.0。从我们的系统中删除此组件将是一个巨大的麻烦,因此,任何解决方案或建议都将不胜感激。
最佳答案
实际上,SQL Server 2012只能与.NET Framework 4.0一起使用。您无法在SQL Server中加载多个版本的CLR。这是设计使然。 SQL Server 2012也不允许再加载混合程序集。
您可以做的是创建一个单独的(web)服务,其中包含当前的.NET 2.0功能。然后从您创建的纯.NET 4.0 CLR程序集调用该服务上的方法。我认为这是您问题最有可能的解决方案。
关于c# - 在MS SQL Server 2012中将Oracle.DataAccess注册为SQLCLR程序集时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22845585/
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
我正在使用Postgres.app在OSX(10.8.3)上。我已经修改了我的PATH,以便应用程序的bin文件夹位于所有其他文件夹之前。Rammy:~phrogz$whichpg_config/Applications/Postgres.app/Contents/MacOS/bin/pg_config我已经安装了rvm并且可以毫无错误地安装pggem,但是当我需要它时我得到一个错误:Rammy:~phrogz$gem-v1.8.25Rammy:~phrogz$geminstallpgFetching:pg-0.15.1.gem(100%)Buildingnativeextension
作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐
我最近对我的计算机(OS-MacOSX10.6.8)进行了删除,并且我正在重新安装我所有的开发工具。我再次安装了RVM;但是,它不会让我安装Ruby1.9.3。到目前为止我已经尝试过:rvminstall1.9.3rvm安装1.9.3-p194rvm安装1.9.3-p448rvminstall1.9.3--with-gcc=clang所有返回相同的命令行错误:Searchingforbinaryrubies,thismighttakesometime.Nobinaryrubiesavailablefor:osx/10.6/x86_64/ruby-1.9.3-p448.Continuin