2013-03-03 186 views
0

我目前正在C#應用程序中以下列方式導入一個函數。可以初始化一個dll文件 - 一個Dll構造函數

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

我的dll文件是用C++編寫的。該方法也在dll的.def文件中定義。 目前,無論何時在第一次嘗試中調用此方法時都會調用其他幾個方法,這些方法爲此方法奠定了基礎。但是這些方法只需要調用一次。這些方法不會再被調用/我想知道是否有一種方法可以在加載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; 
} 
+1

太糟糕VS不使用GNU兼容的編譯器。我*愛*'__attribute __((構造函數))'。 – 2013-03-03 07:04:14

+0

您可以將代碼添加到DLL_PROCESS_ATTACH案例中,但是對於可以執行的操作有限制。建議導出一個init()函數並從你的應用程序調用它一次。 – hmjd 2013-03-03 07:59:23

+0

那麼,這裏有什麼問題? – 2013-03-03 07:59:57

回答

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++