Разрешить ссылку на .net tlb


Прямо сейчас я пишу .net dll, который можно использовать в коде VBA (Excel, Access и т. д.). Следующая установка работает нормально:

[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
[Guid("8079e4a4-1e4b-4788-92ba-9d5b017fa9be")]  //Allocate your own GUID
public interface ICommunication
{
    string TestProp { get; set; }
    string Login();
    string Disconnect();
}

[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
[Guid("19fd86e2-f1b9-478c-ba7a-bd76bdf19b85")]  //Allocate your own GUID
[ProgId("TestDll.Communication")]
public class Communication : ICommunication
{
    public string TestProp { get; set; }

    public string Login()
    {
        // use of BouncyCastle here
        return "logged in";
    }

    public string Disconnect()
    {
        // ...
        return "disconnected";
    }
}

Ссылаясь на сгенерированный файл tlb, я могу правильно использовать функцию отключения свойств, однако вызов функции входа приводит к проблемам (окно сообщения «Файл не найден» в Excel), которые, как я полагаю, связаны с использованием BouncyCastle, на который ссылается.

Sub Button1_Click()
    Dim o: Set o = CreateObject("TestDll.Communication")
    Dim value As String
    value = o.Login()
    MsgBox value
End Sub

Как лучше всего обращаться со ссылками на другие сборки .net внутри видимых библиотек com? До сих пор я безуспешно пытался зарегистрировать bouncycastle в GAC.

Спасибо :)


person MaxWell    schedule 06.03.2017    source источник
comment
Я предполагаю, что где-то в методе Login возникает исключение или исключение возникает во время JIT. Чтобы диагностировать эту проблему, я рекомендую: 1) Переместить все содержимое метода Login во вспомогательный метод (private string LoginHelper() {...}). 2) Перепишите метод Login, чтобы он вызывал помощника внутри блока try/catch. Зарегистрируйте исключение как-нибудь.   -  person Michael Gunter    schedule 07.03.2017
comment
Не видя кода в вашем методе Login(), в качестве отправной точки вы можете обернуть его в try/catch и показать окно сообщения с любыми деталями исключения. Добавьте using System.Windows.Forms; в свой класс и в свой метод try { your code; } catch (Exception e) { MessageBox.Show(e.ToString()); }. Кроме того, создайте приложение WinForms или WPF в качестве тестовой оболочки с копией вашего метода, который вы можете запустить для лучшего тестирования.   -  person zaphodalive    schedule 07.03.2017
comment
Спасибо. Попробуйте поймать и вернуть исключение. ToString() было хорошей идеей!   -  person MaxWell    schedule 06.07.2018


Ответы (1)


Это действительно было похоже на предложенный выше файл, который нельзя было прочитать: при каждой сборке я помещаю .txt в каталог bin проекта, который читается во время выполнения. Используя dll в моем решении, файл можно было найти, поскольку относительный путь был моим каталогом bin, однако с использованием tlb относительный корневой путь был папкой документов вошедшего в систему пользователя Windows.

Забавно, как я все время думал, что ошибка связана с тем, как я настроил свою dll как видимую com :).

person MaxWell    schedule 08.03.2017