2013-03-03 184 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++