视力的NET C#调用C++本机Win32 DLL时出现问题
visual .NET C# problems calling C++ Native Win32 DLL
我的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,其中保留了空间
相关文章:
- WinRT 应用调用 win32 c++ dll 发送参数
- 在 win32 上生成 R 包:无法加载共享对象 (.dll)
- 无法创建 DLL:获取 DLL "is not a valid Win32 application"
- C++ DLL 运行时错误"abc.dll is not a valid WIN32 application" 。请帮助解决这个问题
- 在通用 Windows 应用程序C++上使用 win32 DLL 库
- 如何打印调试C++ Win32 DLL?
- 我可以在 Win32 DLL 中使用 LoadLibrary 吗?
- 如何制作一个不依赖msvc dll的win32应用程序
- 如何使用Cmake为SimuroSot模拟器构建(从DevCpp转换)Win32 DLL
- 托管C#Win32应用程序的非托管DLL.与课堂入口
- 在DLL中关闭Win32对话框时(来自WPF应用程序)时例外
- 在 Unity 中使用 x64 c++ dll 可以"Is not a valid Win32 application error"
- 将C /CLI DLL导入C Win32控制台(Unmanage)
- 如何将窗口句柄从C#传递到C Win32 DLL
- 视力的NET C#调用C++本机Win32 DLL时出现问题
- JNI C++ DLL - 'UnsatisfiedLinkError: %1 is not a valid Win32 application'
- DLL 导致"Microsoft Excel has stopped working"但它在 Win32 控制台应用中工作正常
- 如何在 win32 中使用 ActiveX dll C++项目 Visual Studio 2010
- OpenSSL win32 without libeay32.dll
- 将.exe转换为 .dll Win32 项目并防止在出现致命错误时退出