0

我目前在 C# 应用程序中以下列方式从我的 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;
}
4

1 回答 1

2

DllMain 最接近 DLL“构造函数”(进行初始化的正确位置是在 DLL_PROCESS_ATTACH 的 case 标签中)。然而,更现实的构造函数是由 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 回答