0

現在、C#アプリケーションで次の方法でdllから関数をインポートしています。

[DllImport("C:\\File.dll")]
public static extern int SomeMethod(int A);

私のdllファイルはC++で書かれています。このメソッドは、dllの.defファイルでも定義されています。現在、このメソッドが最初の試行で呼び出されるたびに、他のいくつかのメソッドが呼び出されます。これらのメソッドは、このメソッドの根拠を設定します。ただし、これらのメソッドを呼び出す必要があるのは1回だけです。これらのメソッドが二度と呼び出されることはありません/dllファイルがロードされるとすぐにメソッドのグループ(初期化子)を呼び出す方法があることを知りたかったのです。dllコンストラクターとして何かありますか?

dllmain.cppにこのようなものがあり、そこに何かを入力してこのタスクを実行できます

// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
4

1 に答える 1

2

DllMainは、DLLの「コンストラクター」に最も近いものです(初期化を行う正しい場所は、DLL_PROCESS_ATTACHのケースラベルです)。ただし、より現実的なコンストラクターは、C#コードによってインスタンス化されたCOMクラスのコンストラクターです。その場合、コンストラクターは、作成するクラスのすべてのインスタンスに対して呼び出されます(C#クラスの場合と同様)。Visual C ++でATLプロジェクトを作成すると、次のようなコードが生成されます。

class ATL_NO_VTABLE CMyClass :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CMyClass, &CLSID_MyClass>,
    public IMyClass
{
public:
    CMyClass()
    {
    }

DECLARE_REGISTRY_RESOURCEID(IDR_MYCLASS1)


BEGIN_COM_MAP(CMyClass)
    COM_INTERFACE_ENTRY(IMyClass)
END_COM_MAP()



    DECLARE_PROTECT_FINAL_CONSTRUCT()

    HRESULT FinalConstruct()
    {
        return S_OK;
    }

    void FinalRelease()
    {
    }

    ...

CMyClassコンストラクターまたはFinalConstructメソッドで、オブジェクトの初期化コードを実行できます。また、SomeMethodメソッドをこのクラス(およびIDLファイルのIDLインターフェイス)に追加します。

次に、C#でそのクラスを次のように使用します。

MyClass mc = new MyClass(); // CMyClass::CMyClass and CMyClass::FinalConstruct are called in C++
mc.SomeMethod(); // CMyClass::SomeMethod is called in C++
于 2013-03-03T08:21:16.587 に答える