首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DLLImport变量MFC

DLLImport变量MFC
EN

Stack Overflow用户
提问于 2013-01-31 14:32:53
回答 1查看 1.2K关注 0票数 1

因此,我创建了以下测试项目:

代码语言:javascript
复制
[DllImportAttribute("TestMFCDLL.dll", CallingConvention = CallingConvention.Cdecl)]
internal static extern int test(int number);

private void button1_Click(object sender, EventArgs e)
{
    int x = test(5);
}

这对于定义了函数测试的MFC dll来说很好,但是实际上我拥有的是许多MFC dll,它们都共享一个公共条目函数,并根据输入以不同的方式运行。基本上,我有大量的dll,我无法在编译时知道名称是什么,我只知道它们有一个类似于程序设置的函数,有没有一种基于运行时知识的导入dll的方法?只需这样做就会返回一个错误:

代码语言:javascript
复制
static string myDLLName = "TestMFCDLL.dll";
[DllImportAttribute(myDLLName, CallingConvention = CallingConvention.Cdecl)]

属性参数必须是属性参数类型的常量表达式、类型表达式或数组创建表达式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-31 14:50:01

如果要动态加载DLL并使用DLL中的函数,则需要做更多的工作。首先,需要动态加载DLL。为此,您可以使用LoadLibrary和FreeLibrary。

代码语言:javascript
复制
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllName);

[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);

其次,您需要获取DLL中函数的地址并调用它。

代码语言:javascript
复制
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string functionName);

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int Test(int number);

把这一切加在一起:

代码语言:javascript
复制
IntPtr pLib = LoadLibrary(@"PathToYourDll.DLL");
IntPtr pAddress = GetProcAddress(pLib, "test");
Test test = (Test)Marshal.GetDelegateForFunctionPointer(pAddress, typeof(Test));
int iRresult = test(0);
bool bResult = FreeLibrary(pLib);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14628211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档