我想从C代码调用.NET dll(v4.5)的方法。此dll使用第三方dll(SKCLNET .NET v1.0)
我为此编写了一个简单的C代码(见下文)。问题是GetProcAddress(...)由于某种原因返回NULL。我不确定代码有什么问题...
我尝试通过.NET-Console-App直接调用dll函数,效果很好。
#include "pch.h"
#include <iostream>
#include <Windows.h>
using namespace System;
typedef std::string(*GetLicenseStatusFunction)();
int main(array<System::String ^> ^args)
{
HMODULE hDLL = LoadLibrary(L"LicenseCheck.dll");
if (hDLL == NULL) {
std::cout << "Error loading the DLL" << std::endl;
return 1;
}
GetLicenseStatusFunction pGetLicenseStatus = (GetLicenseStatusFunction)GetProcAddress(hDLL, "ValidateLicense.GetLicenseStatus");
if (pGetLicenseStatus == NULL) {
std::cout << "Error getting the function pointer" << std::endl;
return 1;
}
std::string result = pGetLicenseStatus();
std::cout << result << std::endl;
return 0;
}
下面是使用的dll的结构:
这里是.NET dll中的ValidateLicense类,函数为GetLicenseStatus()
,我想访问。
1条答案
按热度按时间t98cgbkg1#
从
using namespace System;
和main
的原型开始,我假设这是一个C++/CLI项目(而不是原生C项目)。
由于使用**C/CLI**意味着它是一个.NET项目,因此您可以使用其他.NET程序集,方法与在C#中使用类似。只需使用项目树中的“add reference”并添加要使用的程序集即可。
LoadLibrary()
和GetProcAddress()
仅用于从本机代码加载和调用本机函数。如上所述,此处并非如此。注意,在C++/CLI中引用类型使用handle to object operator (^)。因此,从C++/CLI端,方法
ValidateLicense.GetLicenseStatus
返回String^
。此外,在C++/CLI中,命名空间和类的作用域使用
::
而不是.
:要打印它,您可以用途:
您也可以将其转换为原生
std::string
: