视力的NET C#调用C++本机Win32 DLL时出现问题

visual .NET C# problems calling C++ Native Win32 DLL

本文关键字:DLL Win32 问题 本机 C++ NET 调用      更新时间:2023-10-16

我的C++DLL源代码是:

#include "stdafx.h"
#include "LicensePolicy.h"
std::string GetLicense()
{
    DWORD dwType = REG_SZ;
    HKEY hKey = 0;
    char value[1024];
    DWORD value_length = 1024;
    LPCWSTR subkey = L"SOFTWARE\Microsoft\Windows NT\CurrentVersion\WSESecurityPolicy";
    LONG openReg = RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey,0, KEY_WOW64_64KEY | KEY_QUERY_VALUE, &hKey);
    if (openReg==ERROR_SUCCESS)
    {
    }
    else
    {
        return "ERROR: No pudo abrir la ruta del registro";
    }
    LONG getReg = RegQueryValueEx(hKey, L"WSEHostProcessID", NULL, &dwType, (LPBYTE)&value, &value_length);
    if (getReg==ERROR_SUCCESS)
    {
        return std::string(value);
    }
    else
    {
        return "ERROR: No pudo obtener el valor del registro";
    }
}
std::string GetXmlTokenNode()
{
    std::string result = GetLicense();
    if (result == "ERROR: No pudo abrir la ruta del registro" ||
        result == "ERROR: No pudo obtener el valor del registro")
    {
        std::ofstream myfile;
        myfile.open ("punto2.txt");
        myfile << result;
        myfile.close();
        return std::string("");
    }
    else
    {
        std::ofstream myfile;
        myfile.open ("punto1.txt");
        myfile << "Valor:" << result;
        myfile.close();
    }
    return std::string("/{0}:Envelope/{0}:Header");
}

此DLL是使用以下名称编译的:LicensePolicy.DLL

定义文件:

图书馆

模块"许可证政策"出口GetXmlTokenNode@1

C#测试DLL的控制台测试DLL如下:

using System.Runtime.InteropServices;
using System.ComponentModel;
namespace TestDllConsoleApplication
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            Test testObj = new Test();
        }
    }
    public class Test
    {
        [DllImport("LicensePolicy.dll", CharSet = CharSet.Unicode)]
        public static extern string GetXmlTokenNode();
        public Test()
        {
            try
            {
                string result = GetXmlTokenNode();
                result += " result";
            }
            catch (DllNotFoundException exDll)
            {
                string error = "Dll no encontrado";
            }
            catch (BadImageFormatException exBad)
            {
                string error = "Plataforma Ensamblado incompatible";
            }
            catch (Win32Exception exWin32)
            {
                string error = "Error general de Win32";
            }
            catch (Exception ex)
            {
                string error = "Error otros";
            }
        }
    }
}

我的问题是,当GetXmlTokenNode();方法执行时,C#测试控制台将立即退出,而不会从DLL中获取结果。然而,通过使用文本文件跟踪DLL执行得很好。

谢谢你很快的帮助!

Aldemar

如果您能够可靠地跨越这种边界返回std::字符串,我会感到惊讶。C++对象通常很难跨越API边界,因为不确定由谁和什么来管理分配/解除分配。

我总是以一种非常"类似C"的方式在C#和C++之间进行互操作,全部为char*和size_t,部分原因是大量的互操作示例是使用Win32 API的,这是C而不是C++。

对于这种类型的字符串返回,我会让c++函数取一个char*和一个size_t,然后从c#端给它传递一个StringBuilder,其中保留了空间