WPF C#应用中的C DLL

C++ Dll in WPF C# application

本文关键字:DLL 应用 WPF      更新时间:2023-10-16

在寻找已经提出了类似问题的解决方案后,而且由于这是我第一次在.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的字符串。