Регистрация .NET DLL для использования в приложении VB6 - PullRequest
7 голосов
/ 29 июня 2011

У меня есть DLL, которую я написал на C #, которую я хочу использовать в своем приложении VB6.

В VS2008 проверяется свойство проекта «Register for COM interop», и когда я компилирую DLL и пытаюсь использовать ее на моей машине для разработки - она ​​работает нормально.

Мне нужно запустить его на компьютере, на котором нет VS2008, поэтому я попытался зарегистрировать эту DLL следующим образом:

C:\WINDOWS\system32>..\Microsoft.NET\Framework\v2.0.50727\regasm myDLL.dll /tlb: myDLL.tlb /codebase

но затем, когда я пытаюсь запустить его, я получаю эту ошибку:

Ошибка автоматизации. Система не может найти указанный файл.

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

Ответы [ 2 ]

4 голосов
/ 30 июня 2011

Так же, как вы указали полный путь к regasm.exe, вам нужно указать полный путь к вашему .dll; -)

1 голос
/ 01 июля 2011

Причина, по которой это происходит, в том, что вы не назначили GUID своим классам.Ваш класс в .NET должен быть оформлен так:

[GuidAttribute("BA713700-522D-466e-8DD4-225884504678")]
public class MyClass

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

Чтобы быть в полной безопасности, ваш класс должен наследовать от интерфейса

[Guid("9AC71CA7-6F82-44A3-9ABE-75354B514A46")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IManager
{
    [DispId(1)]
    void Display(ADODB.Recordset recordSet);
    [DispId(2)]
    void Close();
}

[Guid("B9BB5B84-8FBD-4095-B846-EC072163ECD3")]
[ClassInterface(ClassInterfaceType.None)]    
[ProgId("This.Is.GonnaBe.MyClass")]    
public class Manager : IManager
{ 
    public void Display(ADODB.Recordset recordset)
    {
        // do stuff
    }
    public void Close()
    {
        // do stuff
    }
}
...