0

私は、他のソフトウェアが私たちのライブラリを(マネージ言語またはアンマネージ言語から)使用できるように、com アクセス可能な単純な dll ライブラリに取り組んできました。

com アクセス可能な dll の作成は非常に簡単です。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace MyNamespace
{
    //This interface defines purely the events. DotNetEventSender should implement this interface with the ComSourceInterfaces() attribute
    //to become an Event Source.
    [ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface COMEventsInterface
    {
        //[DispId(1)]
        // we don't have any events, but if needed, include them here

    }

    [ComVisible(true)]
    public interface ICOM
    {
        //Methods
        int Sum(int[] intsToSum)
    }

//Identifies this interfaces that are exposed as COM event sources for the attributed class.
    [ComSourceInterfaces(typeof(COMEventsInterface))]
    //Tells the compiler not to generate an interface automatically and that we are implementing our own interface (IDotNetEventSender)
    [ClassInterface(ClassInterfaceType.None)]
    [ComVisible(true)]
    public class COM : ICOM
    {

        // Methods
        public int Sum(int[] intsToSum)
        {
            int sum = 0;
            foreach ( int i in intsToSum )
            {
                sum += i;
            }
            return sum;
        }
    }
}

デバッグ モードでは、[Project] > [Properties] > [Build] > [Register for com interop] を介して、このプロジェクトを com-interop に登録するようにマークします。

リリース モードでは、プロジェクトからのプライマリ出力を「vsdrpCOM」としてマークするインストーラーがあります。

そして、これはほとんどの場合、うまく機能します。しかし、どういうわけか、一部のマシン (すべてアメリカ製) ではこれが機能しません。com クラスは登録されますが、私は常にエラーを取得します: HRESULT 0x80131534、これは実際には既にここで説明されています SO:クラシック ASP 経由で .NET/COM 相互運用クラスをインスタンス化するときのエラー

しかし、実際には、ここには解決策がありません。ユーザー権限、ドメイン権限などを確認しました...

編集:私の実際のクラスのコンストラクターは、この1つのことを行います:(これはコンストラクターのエラーであることがSOでわかったため、try catchを追加しました...)

// Constructor
    public COM()
    {
        try
        {
            // register itself with the application
            MyApplication.COMObject = this;
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

それ自体を静的クラスのプロパティ COMObject に登録するだけです。

private static COM _comObject;
public static COM COMObject
        {
            get
            {
                return _comObject;
            }
            set
            {
                _comObject = value;
            }
        }

COM クラス自体を登録する必要は実際にはありませんが、イベントをトリガーしたい場合に将来使用するためにこれを行いました。

4

1 に答える 1