调用GetProcAddress(...)时,从C++代码调用.NET dll失败

ncecgwcz  于 2023-02-10  发布在  .NET
关注(0)|答案(1)|浏览(199)

我想从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(),我想访问。

t98cgbkg

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中,命名空间和类的作用域使用::而不是.

using namespace ....
//...
String^ sts = ValidateLicense::GetLicenseStatus();

要打印它,您可以用途:

Console::WriteLine(sts);

您也可以将其转换为原生std::string

#include <string>
#include <msclr/marshal_cppstd.h>
//...
std::string sts_cpp = msclr::interop::marshal_as<std::string>(sts);

相关问题