WPF C#应用中的C DLL
C++ Dll in WPF C# application
在寻找已经提出了类似问题的解决方案后,而且由于这是我第一次在.NET应用程序中使用non-.net dll,所以我真的需要您的帮助。
我有一个使用MVVM模式的WPF应用程序,在我的ViewModel
类中,我需要在C 中使用DLL来恢复令牌。我在C 中有一个使用此DLL的示例,因此我有该方法的名称,但是我在C#中做不到。我知道我必须使用DllImport
使用此方法,但是如何实现并使用C#??
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <string>
int main()
{
HINSTANCE hinst = NULL;
typedef bool ( *GetTokenProto )( char ** );
typedef void ( *FreeTokenProto )( char * );
GetTokenProto GetToken;
FreeTokenProto FreeToken;
std::string str = "DllName.dll";
std::string token;
if ( (hinst = LoadLibraryA(str.c_str()) ) )
{
GetToken = (GetTokenProto) GetProcAddress(hinst, "GetToken");
FreeToken = (FreeTokenProto) GetProcAddress(hinst, "FreeToken");
if (GetToken && FreeToken)
{
char *buf;
if (GetToken(&buf))
{
token = buf;
FreeToken(buf);
std::cout << "Token:" << token << std::endl;
}
else
{
std::cerr << "DLL loaded but no token" << std::endl;
exit(1);
}
}
else
{
std::cerr << "DLL loaded but missing proc address(es)" << std::endl;
exit(1);
}
FreeLibrary(hinst);
}
else
{
std::cerr << "Failed to load DLL" << std::endl;
exit(1);
}
return 0;
}
update
[DllImport("DllName.dll", EntryPoint = "GetToken", CallingConvention = CallingConvention.Cdecl)]
public static extern bool get_token(ref string token);
[DllImport("DllName.dll", EntryPoint = "FreeToken", CallingConvention = CallingConvention.Cdecl)]
public static extern void free_token(ref string token);
public static string a_token;
public string get_token_method()
{
try
{
string buffer = null;
if (get_token(ref buffer))
{
a_token = buffer;
free_token(ref buffer);
Debug.WriteLine("token : " + a_refresh_token);
}
else
{
Debug.WriteLine("DLL Loaded but no token");
}
}
catch (Exception ex)
{
Debug.WriteLine("n" + ex.Message);
}
return a_refresh_token;
}
错误
我有一个例外" system.dllnotfoundexception":无法加载dll 'dllname.dll':找不到指定的模块。(例外 从Hresult:0x8007007e(。
dll文件位于.exe的同一文件夹中(.. bin debug(
如果您的DLL在同一目录中,仍然有一些问题可能是问题。
首先
DLL可能具有依赖关系
您使用的本机dll可能具有其他依赖项已安装(尝试依赖性沃克(。如果本地DLL需要示例注册表设置,配置文件等。这些也应该是展示。它应该按照您的方式分配给用户机器将其安装在开发机上。
很可能您错过了C 重新分布软件包(我不确定这是一个(,但是依赖性沃克应该告诉您。
其次
它可能针对不同的位,即x86 x64,所以我会尝试更改您的项目以查看是否有帮助
右键单击您的项目,然后选择属性。
在属性中,选择"构建"选项卡。在平台目标下,选择x86。
点击Ctrl Shift S要保存所有文件,右键单击解决方案,然后选择"清洁"。摆脱旧二进制文件。此后任何构建应该是32位
您可以在调用dll
之前使用setDlldirectory方法设置DLL的路径[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool SetDllDirectory(string lpPathName);
如果要从c 获得字符串,也应该使用stringbuilder而不是c#side的字符串。
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- C# DLL 从C++应用程序调用 SOAP Web 服务
- 将 c++ 生成器应用程序与外部 dll 结合使用
- WinDeployqt 不会为调试应用程序部署 Qwindowsd.dll
- Log4net,将日志消息从 c++ dll 发送到 c# 应用程序?
- 调试 ASP MVC 应用程序中使用的C++ DLL
- WinRT 应用调用 win32 c++ dll 发送参数
- Qt应用程序找不到第三方DLL并崩溃
- 如何将从控制台应用程序C++回调设置为C++ COM DLL
- 我可以用C++/WinRT编写一个DLL,供windows桌面应用程序(而不是UWP)或Unity插件使用吗
- .NET核心应用程序无法加载C++DLL
- x64 位的 C++/CLI DLL 和 Exe 的应用崩溃
- 在通用 Windows 应用程序C++上使用 win32 DLL 库
- 从 C# Windows 应用程序调用 C dll 会导致 svchost.exe 崩溃
- 使用 C++ dll 运行 c# 应用程序会生成无法加载异常
- 为什么我的 C# 应用程序无法加载我的 C++ dll?
- 应用程序仅在qt调试器中加载dll,而不是独立加载
- Cygwin1.dll c++ 应用程序错误
- 在线更新DLL应用程序