【发布时间】:2013-04-16 01:39:57
【问题描述】:
有一个 VB.net 64 位项目要在 Excel 64 位中引用。我有一个 VB.net 项目引用的 c# 助手类。我已经签署了所有项目,并为 Make Com Visible 设置了 VB.net 项目。它构建并运行良好。 当我将我的 VB.net 项目设置为 Register for COM interop 时出现错误。
错误 120 无法注册程序集“E:\KSP\KSP\SealData\bin\x64\Debug 64***[VB].dll”。无法加载文件或程序集“[C# 程序集名称],版本=1.0.0.0,文化=中性,PublicKeyToken=c89dd9761ce81049”或其依赖项之一。该系统找不到指定的文件。 SealDataStage
C# 项目已签名 C# 并在 VB 项目中引用。在某些时候,我得到了编译,安装项目为 VB.net 项目创建了文件和 tlb。现在我无法让它再次构建。我查看了 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 的所有可能组合。
- 我使用相同的密钥对项目和不同项目进行签名
我让它工作了排序:我在 2012 年打开了这个项目。它允许我注册 COM 而不是签名。如果我签署项目,它会给我与 2010 年相同的错误。所以我猜这是一个签名问题。我读到您可以手动注册未签名的 dll 或 GAC,如果它已签名。从 2010 年开始,我可以手动将 dll 添加到安装项目中。我更愿意在 2010 年为安装项目构建和使用它。
工作解决方案 这篇文章给了我答案,并且在 c# 中 Excel 2010 64 bit can't create .net object
COM 设置和手动注册 dll 的组合是关键。按照上面帖子中的答案并确保您没有检查注册 COM 选项然后您必须使用 64 位 regasm 实用程序。 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 中工作”无论如何,我想 id 发布工作细节。我必须说有很多错误的信息到处跑。我为此头疼了几天。 ConvertByteArrayToSingleArray 方法是修复 com 将数组作为对象返回的方式。
确保您以管理员身份运行 Visual Studio
我通过配置管理器将两个项目的所有编译选项都设置为 64 位。 为 VB 启用 Com 并且 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
我真的希望这可以挽救我失去的日子。 :-) 如果我确实帮助在这里放下一行。我会每隔一段时间回来看看。
【问题讨论】:
-
您是否可以尝试从您的 SealDataStage 项目中删除对 UpgradeHelpers.VB6 的引用,然后再次添加它作为参考。现在会建造吗?
-
尝试创建一个引用 UpgradeHelpers.VB6 的小型演示 .net 64bit,看看它是否有效
标签: c# vb.net excel 64-bit com-interop