C# oa_spcreate返回.net程序集上未注册的类错误

C# oa_spcreate返回.net程序集上未注册的类错误,c#,sql,.net,sql-server,dll,C#,Sql,.net,Sql Server,Dll,由于我无法控制的原因,我被迫使用SQL Server 2008 R2 64位中的oa\u spcreate功能。64位版本(考虑32位)不支持旧的VB6 DLL(我也无法控制) 我尝试为旧DLL上的一些函数创建.NET包装器。接着是零零碎碎的东西把它拼凑在一起 代码示例: namespace Some32bitWrapper { [ClassInterface(ClassInterfaceType.None)] 公共类Dissues32类:iDissues32iClass { 公开讨论32类()

由于我无法控制的原因,我被迫使用SQL Server 2008 R2 64位中的
oa\u spcreate
功能。64位版本(考虑32位)不支持旧的VB6 DLL(我也无法控制)

我尝试为旧DLL上的一些函数创建.NET包装器。接着是零零碎碎的东西把它拼凑在一起

代码示例:

namespace Some32bitWrapper
{
[ClassInterface(ClassInterfaceType.None)]
公共类Dissues32类:iDissues32iClass
{
公开讨论32类()
{
}
//实例化iclass并在服务器上执行InsertLocDetailLinesOnServer
公共对象InsertLocDetailLinesOnServer(字符串ConnectString、字符串DetailsString、int User)
{
尝试
{
讨论32.Iclass _Iclass=新的Iclass();
Object _return=_iclass.InsertLocDetailLinesOnServer(ConnectString,DetailsString,User);
返回(return);;
}
捕获(异常er)
{
返回er消息;
}
}
}
公共接口iDissues32iClass
{
对象InsertLocDetailLinesOnServer(字符串ConnectString、字符串DetailsString、int User);
}
}
遵守并向tlb regasm和tlb注册,gacutil将其发布。一切似乎都很无聊。只要我尝试在SQL存储过程中使用
sp_oacreate
get“Class not registed”错误运行它

存储的过程代码:

ALTER PROCEDURE[dbo]。[DIME\U INSERTLOCDETAILINESONSERVER]
@t连接字符串varchar(255),
@SysUser int,
@tDetailsString文本
作为
声明@hr int
声明@objectint
声明@returnint
声明@Output varchar(255)
--HKEY_CLASSES_ROOT\TypeLib\{492BF323-0691-4F62-9171-3F75F4DF2753}
exec@hr=sp_OACreate'Some32bitWrapper.dissues32class',@object out,5
如果@hr 0
开始
EXEC sp_Getoaerrorinfo@object、@hr、@output out
选择@output,@hr
返回-2
结束
其他的
返回“已注册”
开始
exec@hr=sp_OAMethod@object,'InsertLocDetailLinesOnServer',NULL,@ConnectString=@tConnectionString,
@DetailsString=@tDetailsString,@User=@Sysuser
如果@hr 0
开始
EXEC sp_Getoaerrorinfo@object、@hr、@output out
选择@output
返回-3
结束
exec@hr=sp_OADestroy@object out
打印@返回
结束
关于它的信息不多,除了“不使用不使用类型”。此时别无选择。有人能帮忙吗


注意:我在SQL Server上运行了所有必需的重新配置选项并授予了权限。

您可以使用
sp\u OACreate
从SQL Server创建32位对象。我知道这一点,因为我做了很长一段时间

实际上,您必须扩展对象的注册,以允许在代理过程中创建组件。这不应影响组件的现有客户端

有关我使用的确切方法,请参见此处:


本,谢谢你的回答,我以前读过并尝试过。我得到了注册表项,但没有效果。有一个带有Guid和dllsurrogate的AppId密钥,它在CLSID\{Guid}下创建了一个AppId密钥来引用应用id。@user2687092这是为了创建旧的VB6对象是吗?注册.Net对象是另一回事。不,我已经创建了VB6对象,我正在尝试在它们周围放置一个.Net包装器,因为在我读到的每一个地方,我都看到SQL2008 R2 64位中的oa_sp函数调用不支持32位DLL。我在VB6 DLL上看到过类未注册的消息,这些消息总是在32位SQL Server上运行。@user2687092,您不需要.Net包装器。如果为32位组件注册代理,则可以直接从SQL 64位创建它。我已经做到了。事实上,一个.Net DLL包装器不会有帮助,因为它将被加载到64位进程本身,因此也无法创建对象。这是我的理解,尽管一个.Net DLL包装器可以在x86平台上编译。我可能需要对代理进行不同的指导,或者让其他人看,我无法让它工作。