有一个要在Excel 64位中引用的VB.net 64位项目。 我有一个由VB.net项目引用的ac#helper类。 我已经签署了所有项目,并为“使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/

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

  1. 引用了助手dll
  2. com和带符号的每种可能组合。
  3. 我在整个项目中使用相同的密钥进行签名,而在不同项目中

我可以使用它某种程度:我在2012年打开了该项目。它可以注册COM而不进行签名。 如果我在项目上签名,将给我与2010年相同的错误。所以我猜这是一个签名问题。 我读到您可以手动注册未签名的dll或GAC(如果已签名)。 我可以手动将dll添加到2010年的安装项目中。我希望在2010年为安装项目构建并使用dll。

工作解决方案这篇文章给了我答案,并且在c# Excel 2010中64位无法创建.net对象

COM设置和手动注册dll的组合是关键。 请按照上面的帖子中的答案进行操作,并确保不要检查REGISTER COM OPTION,然后必须使用64位regasm util。 C:\\ Windows \\ Microsoft.NET \\ Framework64 \\ v4.0.30319 \\ regasm“ C:\\ Program Files \\ Default公司名称\\ KSP_Setup ******。dll” / tlb / codebase

签名问题已解决 -----我将其重命名为C#项目。 然后,我不断收到关于使用签名程序集进行编译时找不到的旧dll名称的错误。 我重新创建了所有强名称键并进行了编译。 现在它也可以在VS2010中运行,并且Setup项目可以运行并注册Com dll。 在COM dll上的安装项目中,设置属性进行注册。

我的解决方案在VB.net中“哎呀,我不喜欢在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

我真的希望这可以使我从失去的日子中拯救出来。 :-)如果我确实在这里帮了忙。 我会不时检查一下。

===============>>#1 票数:1

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

如果您有需要注册Interop的程序集,则该程序集必须为32位。 您不能将其注册为COM组件

  ask by Steve Coleman translate from so

未解决问题?本站智能推荐: