2013-04-16 1 views
0

имеет 64-битный проект VB.net, на который можно ссылаться в 64-битной версии Excel. У меня есть вспомогательный класс C#, на который ссылается проект VB.net. У меня есть все проекты, подписанные, и проект VB.net установлен для Make Com Visible. Он строит и работает отлично. Когда я установил свой проект VB.net для регистрации для COM-взаимодействия, я получаю сообщение об ошибке.VB.NET 64-битный COM с ссылочным классом вспомогательной сборки C#

Ошибка 120 Не удается зарегистрировать сборку "E: \ KSP \ KSP \ SealData \ bin \ x64 \ Debug 64 *** [VB] .dll". Не удалось загрузить файл или сборку '[C# Assembbly name], Version = 1.0.0.0, Culture = 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/

Обновленная информация: Я попробовал следующее.

  1. подпитывали библиотека DLL Helper
  2. все возможные комбинации ком и подписаны.
  3. Я использовал тот же ключ для подписания через проекты и различные те

Я получил его на работу Сорт: Я открыл проект в 2012 году позволяет мне зарегистрировать COM и не должны быть подписаны. Если я подписываю проекты, это дает мне ту же ошибку, что и в 2010 году. Поэтому я предполагаю, что это проблема с подписью. Я читал, что вы можете вручную зарегистрировать dll без знака или GAC, если он подписан. Я могу вручную добавить DLL в проект установки с 2010 года. Я бы предпочел построить и работать с этим в 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 Название компании \ KSP_Setup ******. Dll"/tlb/codebase

Проблема с подписью была решена ----- Я переименовал проект C#. Затем я продолжал получать сообщение об ошибке, когда старое имя dll не было найдено при компиляции с подписанной сборкой. Я воссоздал все сильные ключевые слова и скомпилировал их. Он также теперь работает в VS2010, и проект установки работает и регистрирует Com dll. В проекте установки на dll COM установите свойства для его регистрации.

Мое решение находится на VB.net «Eck, мне не нравится работать в VB». В любом случае, я решил, что id опубликует рабочие детали. Должен сказать, что вокруг происходит много дезинформации. Я несколько раз ударил головой об этом. Метод 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 

Я действительно надеюсь, что это спасет кого-то из дней, которые я потерял. :-) Если бы я действительно помог сбросить линию здесь. Я проверю время от времени.

+0

Только для хорошей меры вы можете попробовать удалить ссылку на UpgradeHelpers.VB6 из своего проекта SealDataStage, а затем просто добавить его снова в качестве ссылки. Будет ли он строить сейчас? –

+0

Попробуйте создать небольшую демонстрационную версию .net 64bit, которая ссылается на UpgradeHelpers.VB6, и посмотреть, работает ли она. – volody

ответ

1

Вы не можете ссылаться на 32-битную сборку из 64-разрядного приложения или сборки.

Если у вас есть сборка, которую требуется зарегистрировать для Interop, это должно быть 32 бит. Вы не можете зарегистрировать его как COM-компонент, иначе

+0

Все имеет значение 64 или .net. Все проекты - 64 бит. –

+0

@SteveColeman - Вы не можете зарегистрировать 64-битную сборку для COM-взаимодействия, следовательно, проблему, о которой вы заявили в своем сообщении. Об этом не обойти. COM построен на 32-битной структуре. –

+0

Мэтт, я не могу найти что-либо, чтобы поддержать ваше утверждение о том, что 64-разрядный офис не будет работать с 64-разрядной библиотекой dll. Я нашел несколько сообщений об этом конкретно. http://www.ironshay.com/post/Developing-Excel-Functions-in-C-for-Excel-2010-64-Bit.aspx –