我目前正在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;
}
答案 0 :(得分: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++