0

有一个 VB.net 64 位项目要在 Excel 64 位中引用。我有 VB.net 项目引用的 ac# helper 类。我已经签署了所有项目,并为 Make Com Visible 设置了 VB.net 项目。它构建并运行良好。 当我将我的 VB.net 项目设置为注册 COM 互操作时,我收到一个错误。

错误 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/

更新信息: 我尝试了以下方法。

  1. 引用了 Helper dll
  2. com 和 signed 的所有可能组合。
  3. 我使用相同的密钥来签署跨项目和不同的项目

我让它工作 排序: 我在 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 上的安装项目中,设置属性以注册它。

我的解决方案在 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

我真的希望这可以从我失去的日子中拯救某人。:-) 如果我确实帮助在这里放下一行。我会每隔一段时间回来看看。

4

1 回答 1

1

您不能从 64 位应用程序或程序集引用 32 位程序集。

如果您有一个需要注册互操作的程序集,则该程序集必须是 32 位。否则不能将其注册为 COM 组件

于 2013-04-16T09:21:10.743 回答