.NET C#问题调用C ++ Native Win32 DLL

时间:2013-11-29 20:31:27

标签: c++ visual-c++

我的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");
}

使用name:LicensePolicy.dll

编译此DLL

定义文件:

LIBRARY

MODULE“LicensePolicy” EXPORTS     GetXmlTokenNode @ 1

C#TestDllConsole测试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#中的方法,C#TestConsole退出而不从DLL获取结果。但是,使用文本文件跟踪DLL很好。

感谢您的帮助!

的Aldemar

1 个答案:

答案 0 :(得分:2)

如果你能在这种边界上可靠地返回一个std :: string,我会感到惊讶。 C ++对象通常很难通过API边界,因为不确定谁以及管理分配/解除分配的人。

我总是以非常'c-like'的方式在C#和C ++之间进行互操作,所有char *和size_t,部分原因是如果互操作示例使用的是Win32 API,那就是C语言,而不是C ++。

对于这种类型的字符串返回,我要使c ++函数取一个char *和一个size_t,然后从C#端传递一个StringBuilder,其中保留了空格。