VB.NET 64位COM与c#引用的辅助程序集类
本文关键字:程序集 引用 NET 64位 COM VB | 更新日期: 2023-09-27 18:09:15
有一个VB.net 64位项目要在Excel 64位中引用。我有一个c#助手类是由VB.net项目引用。我有所有的项目签署和VB.net项目设置为Make Com可见。它可以很好地构建和运行。当我将VB.net项目设置为注册COM互操作时,我得到一个错误。
错误120无法注册程序集"E:'KSP'KSP'SealData'bin'x64'Debug 64***[VB].dll"。无法加载文件或程序集'[c#程序集名称],版本=1.0.0.0,文化=neutral, PublicKeyToken=c89dd9761ce81049'或其依赖项之一。系统找不到指定的文件。SealDataStage
c#项目签名为c#,在VB项目中被引用。在某些时候,我得到了它的编译和安装项目创建的文件和一个tlb为VB.net项目。现在我不能让它重新建造了。我已经在GAC中查看了,我没有在列表中看到我的dll。所以我看不出这怎么会是一场gac冲突。但是我不知道该怎么办。
这是我所遵循的解决方案与Excel工作的帖子。http://richnewman.wordpress.com/2007/04/15/a-beginner%E2%80%99s-guide-to-calling-a-net-library-from-excel/
更新信息:我试过以下方法。
- 引用Helper dll
- com和signed.的所有可能组合
- 我使用相同的密钥在项目和不同的项目之间签名
我让它工作Sort of:我在2012年启动了这个项目。它允许我注册COM而不被签名。如果我签署的项目,它给了我相同的错误,2010年。所以我猜这是签约的问题。我读到你可以手动注册一个未签名的dll或GAC,如果它签名。我可以手动将dll添加到2010年的安装项目中。我更愿意在2010年为安装项目构建和使用这个。
工作方案这篇文章用c#给了我答案Excel 2010 64位不能创建。net对象
COM设置和手动注册dll的组合是关键。遵循上面帖子中的答案,并确保您不检查REGISTER COM选项,然后您必须使用64位正则化util。C:' windows' Microsoft.NET'Framework64'v4.0.30319'regasm "C:'Program Files'Default Company Name'KSP_Setup******.dll"/tlb/codebase
签名问题解决了-----我重命名了c#项目。然后我一直得到一个错误,关于旧的dll名称没有找到与签名程序集编译。我重新创建了所有强名称键,并进行了编译。它现在也可以在VS2010中工作,并且安装项目可以工作并注册Com dll。在COM dll上的setup项目中,设置属性以注册它。
我的解决方案是在VB.net"Eck,我不喜欢在VB工作"无论如何,我想我张贴工作细节。我必须说有很多错误的信息在流传。我为此撞了好几天脑袋。ConvertByteArrayToSingleArray方法修复了com将数组作为对象返回的方式。
确保以管理员身份运行Visual Studio
我通过配置管理器将两个项目的所有编译选项设置为64位。使Com在VB中启用,c#不需要Com。
Option Strict Off
Option Explicit On
Imports UpgradeUtils.Activex
Imports System
Imports System.Runtime.InteropServices
<Guid("1F249C84-A090-4a5b-B592-FD64C07DAB75"), _
InterfaceType(ComInterfaceType.InterfaceIsDual)> _
Public Interface IclsSealDataStage
<DispId(1)> Function SetStages(ByRef Starts As Object, ByRef Ends As Object, ByRef Cnt As Integer, ByRef XTIME As Object, ByRef YTORQUE As Object, ByRef YDP As Object, ByRef YOILLEVEL As Object, ByRef YOILTEMP As Object, ByRef YSPEED As Object) As Object
Sub RegisterInitGlobalVarsDelegates()
End Interface
<ComVisible(True), _
Guid("E42FBD03-96DF-43a7-A491-23E735B32C5C"), _
ProgId("SealDataStage.clsSealDataStage"), _
ClassInterface(ClassInterfaceType.None)> _
Public Class clsSealDataStage
Inherits ComponentClassHelper
Implements IclsSealDataStage
Public Function SetStages(ByRef Starts As Object, ByRef Ends As Object, ByRef Cnt As Integer, ByRef XTIME As Object, ByRef YTORQUE As Object, ByRef YDP As Object, ByRef YOILLEVEL As Object, ByRef YOILTEMP As Object, ByRef YSPEED As Object) As Object Implements IclsSealDataStage.SetStages
Dim oStarts As Array = ConvertByteArrayToSingleArray(Starts)
Dim oEnds As Array = ConvertByteArrayToSingleArray(Ends)
Dim oXTIME As Array = ConvertByteArrayToSingleArray(XTIME)
Dim oYTORQUE As Array = ConvertByteArrayToSingleArray(YTORQUE)
Dim oYDP As Array = ConvertByteArrayToSingleArray(YDP)
Dim oYOILLEVEL As Array = ConvertByteArrayToSingleArray(YOILLEVEL)
Dim oYOILTEMP As Array = ConvertByteArrayToSingleArray(YOILTEMP)
Dim oYSPEED As Array = ConvertByteArrayToSingleArray(YSPEED)
Form1.DefInstance.PlotData(oXTIME, oYTORQUE, oYDP, oYOILLEVEL, oYOILTEMP, oYSPEED)
'Form1.pg_MouseDown Starts(), Ends()
Form1.DefInstance.starts_ends(oStarts, oEnds, Cnt)
Form1.DefInstance.ShowDialog()
Return VB6.CopyArray(stages) 'Oddly enough these are not suppose to work in 64 but do????
End Function
Private Function ConvertByteArrayToSingleArray(ByVal Starts As Object) As Array
Dim obj As Object = DirectCast(Starts, Object)
Dim ct As Array = DirectCast(obj, Array)
Dim content As Single() = New Single(ct.Length) {}
ct.CopyTo(content, 0)
Return ct
End Function
我真的希望这能从我失去的日子里拯救一些人。如果我能帮上忙的话。我会每隔一段时间回来看看的。
不能从64位应用程序或程序集引用32位程序集。
如果你有一个程序集,你需要注册互操作,这个必须是32位。您不能将其注册为COM组件,否则