6

.NET COM 相互運用性は、これまで常に非常にうまく機能していました。Windows 7 にアップグレードしてから、.NET COM オブジェクトが機能しなくなりました。

私の COM オブジェクトは次のように簡単です。


namespace Crap
{
    [ComVisible(true)]
    [Guid("2134685b-6e22-49ef-a046-74e187ed0d21")]
    [ClassInterface(ClassInterfaceType.None)]
    public class MyClass : IMyClass
    {

        public MyClass()
        {}

        public void Test()
        {
            MessageBox.Show("Finally got in here.");
        }

    }
}



namespace Crap
{
    [Guid("1234685b-6e22-49ef-a046-74e187ed0d21")]
    public interface IMyClass
    {

    }
}


アセンブリも ComVisible とマークされています。

を使用してアセンブリを登録します

regasm /codebase /tlb "path"

登録に成功しました (管理者モード)。regasm 32 と 64bit を試しました。どちらの場合もエラーが発生します

このvbscriptを使用して「ActiveXコンポーネントはオブジェクトCrap.MyClassを作成できません」:


dim objReg
Set objReg = CreateObject("Crap.MyClass")
MsgBox typename(objReg)

fuslogvw もヒントを与えてくれません。その COM オブジェクトは、私の Vista 32 ビット マシンで完全に動作します。

その問題の解決策をグーグルで検索できなかった理由がわかりません..その問題に遭遇したのは本当に私だけですか?

OleView を見ると、オブジェクトが正常に登録されていることがわかります。他の COM オブジェクトも作成できます。自分のオブジェクトだけでは機能しません。

ありがとう、ケビン

4

2 に答える 2

2

私は C# の人ではありませんが、VB.net から変換したサンプルを次に示します。プロジェクト レベルで 1 つの名前空間を確保し、次に VB プロジェクトでこのクラスを確保する必要があったことに注意してください。C# プロジェクトではそれが異なることを理解しています。

[ComClass(MyClass.ClassId, MyClass.InterfaceId, MyClass.EventsId)] 
public class MyClass {

    // These  GUIDs provide the COM identity for this class 
    // and its COM interfaces. If you change them, existing 
    // clients will no longer be able to access the class.
    public const string ClassId = "f58411e1-1689-4bf3-a0e1-b49f479e28ba";
    public const string InterfaceId = "f4a575c6-62d2-44eb-af0f-f5b2bb65ad51";
    public const string EventsId = "ad56e4f9-3512-4233-aae4-7d1c2457c08f";

    // A creatable COM class must have a Public Sub New() 
    // with no parameters, otherwise, the class will not be 
    // registered in the COM registry and cannot be created 
    // via CreateObject.
    public SalePayStatus() : base()
    {
    }
}

COM が心配な場合は、常に最初にレジストリをチェックインして、適切なエントリが作成されていることを確認します。バージョン管理と MSI のインストールが問題を引き起こすことがわかりました。特に、アンインストール (レジストリをクリーンアップしません) するか、既存の COM エントリを上書きする .net COM オブジェクトを使用して MSI を再インストールすると、あらゆる種類の問題が発生します。

一般的に、x64 ビルドと x32 ビルドの .net DLL には注意が必要です。たとえば、VBS エンジンの C:\Windows\SysWow64\ または C:\Windows\System32\ エディションを明示的に参照する必要がある場合があります。

最後に、x32 COM .net コンポーネントを備えた x64 サーバー上の ASP Web サイトで VBS を使用している場合は、IIS 7 アプリケーション プールの詳細オプション Is 32 bit application が正しく True/False に設定されていることを確認する必要があります。

于 2010-05-18T06:00:55.760 に答える
1

ありがとう!私が世話をしなければならない2つのレジストリがあることを知りませんでした..私が推測するWin7 64ビットに切り替える時が来ました:)

ありがとうございました。

同じ問題に遭遇した他のすべての人のために:wscript(通常vbsファイルを実行するクライアント)は64ビットモードで実行されます=> RegAsm 64ビットが使用されます

Excel などの他の一般的なクライアントは 32 ビット モードで実行されます => RegAsm 32 ビットが使用されます。

Visual Studio は 32 ビットで実行されます => COM 相互運用に登録すると、COM オブジェクトは 32 ビット レジストリにのみ登録されます。

私が理解しなければならない唯一のことは、VSセットアップが両方のバージョンを登録することを確認する方法です

于 2010-05-01T19:24:51.043 に答える