Как я могу исправить ошибку времени выполнения 430 от импорта пользовательских DLL в проект VBA - PullRequest
0 голосов
/ 10 апреля 2019

Я несколько часов бьюсь над этим и не могу понять, что я делаю не так.

Я создал новый проект C # dll, вот содержимое единственного класса, который он содержит:

using System;
using System.Runtime.InteropServices;

namespace PolygonSl {

    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class Config {

        [ComVisible(true)]
        public string GetCompany() {
            return "POL";
        }
    }
}

Я в основном удаляю из него все, пытаясь заставить его работать, единственная ссылка - System.

Я установил флаг Make assembly COM-Visible на Assembly Information, и мой проект подписан (швы необходимы для кодовой базы).

Он прекрасно компилируется, после этого я позвонил RegAsm.exe, дав ему dll, добавил /codebase и /tlb, команда выполнена успешно.

Когда я иду в свой проект VBA, я могу добавить мой новый файл tlb к ссылкам, работающий нормально. После этого я могу использовать его в своем коде, автозаполнение работает, и я могу скомпилировать без ошибок.

Затем, когда я выполню, я получил это:

Run-time error '430':
Class does not support Automation or does not support expected interface

Вот мой пример кода в VBA:

Private Sub Button1_Click()
    'With CreateObject("PolygonSl.Config")
    With New PolygonSl.Config
        MessBox .GetCompany, MB_OK, "Test"
    End With
End Sub

Я пытался с поздним связыванием, и мой код нормально с ним работает, но я хотел бы иметь возможность использовать автозаполнение.

У кого-нибудь есть предложение о том, что я мог бы попытаться заставить его работать?

Редактировать (добавить некоторые подробности о моем окружении)

  • Я работаю над VS2008 для проектов, связанных с Dynamics SL (одна из ERP-систем Microsoft)
  • Я нахожусь на Windows Server 2008 R8 Standard, работающем от VMWare
  • Компиляция на Framework 3.5, Release, x86, клиент Dynamics SL - 32 бита
  • Я попробовал мою dll на динамике, но также и на Excel, чтобы убедиться, что проблема не в динамике;)

1 Ответ

1 голос
/ 10 апреля 2019

Я думаю, вам нужно определить интерфейс, чтобы иметь возможность видеть getcompany.

using System;
using System.Runtime.InteropServices;

namespace PolygonSl
{
    [Guid("6DC1808F-81BA-4DE0-9F7C-42EA11621B7E")]
    [System.Runtime.InteropServices.ComVisible(true)]
    [System.Runtime.InteropServices.InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface IConfig
    {
        string GetCompany();
    }

    [Guid("434C844C-9FA2-4EC6-AB75-45D3013D75BE")]
    [System.Runtime.InteropServices.ComVisible(true)]
    [System.Runtime.InteropServices.ClassInterface(ClassInterfaceType.None)]
    public class Config : IConfig
    {
        public string GetCompany()
        {
            return "POL";
        }
    }
}

Вы можете создать интерфейс автоматически, поместив курсор в определение класса и используя Edit.Refactor.ExtractInterface.

Я должен признать, что я нахожусь здесь на абсолютном краю своих способностей, и вышесказанное составлено на основе примеров, которые я видел в других местах.

Редактировать

Следующий тестовый код отлично работает на моем ПК

Option Explicit
Sub polygontest()

    Dim my_polygon As SOPolygon.Config
    Set my_polygon = New SOPolygon.Config
    Debug.Print my_polygon.GetCompany

End Sub

Где SOPolygon - имя проекта.

...