7

VB6 アプリケーションで使用したい C# で記述した DLL があります。

VS2008 では、プロジェクト プロパティ "Register for COM interop" がチェックされ、DLL をコンパイルして開発マシンで使用しようとすると、正常に実行されます。

VS2008 がインストールされていないコンピューターで実行する必要があるため、この DLL を次のように登録しようとしました。

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

しかし、実行しようとすると、次のエラーが発生します。

自動化エラー。システムは、指定されたファイルを見つけることができません。

誰が私が間違っているのか教えてもらえますか?

4

2 に答える 2

4

regasm.exe へのフル パスを指定したように、.dll へのフル パスを指定する必要があります ;-)

于 2011-06-29T21:48:55.583 に答える
1

これが発生する理由は、クラスに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
    }
}
于 2011-06-30T21:48:21.570 に答える