golang编译dll给C#调用

Python022

golang编译dll给C#调用,第1张

最近需要用到golang编译dll给C#调用,记录一下,希望可以给遇到的朋友一些帮助。

开发环境:

1.windows7,VS2019,VScode

2.macOS,VScode

习惯在macos开发golang应用,先写好了dll,可以参考:

https://blog.csdn.net/henreash/article/details/88768206

然后在windows7上面使用C#调用的时候出现不能识别dll,于是只好在windows7安装golang开发环境。

简单安装了VScode和mingw64.

https://sourceforge.net/projects/mingw-w64/

测试时发现了一个问题,如下:

最后找到的原因是我的windows7是64位的,mingw也是64位的,需要在VS2019里面将目标平台设置如下:

当然,也可以将目标平台设置为x64的即可,我这样设置,系统就自己去适配了。

网上的大部分是说设置目标平台为x86,这个要根据具体情况而来,不能一概而论。好了,希望能帮到您。

使用C#生成dll文件并调用

一、创建dll文件:

例如生成一个md5编码判断状态的文件,即,输入一个字符串(string A)和一个32位md5编码(string B),判断此字符串A对应的32位md5编码是否与B相等,如果相等返回true,否则返回false。

打开VS 2005,“文件”--》“新建”--“项目”,选择“Windows 控件库”,命名后点击“确定”,在“UserControl1.cs”中输入以下代码:

using System

using System.Collections.Generic

using System.ComponentModel

using System.Drawing

using System.Data

using System.Windows.Forms

using System.Text

using System.Security.Cryptography

namespace md5

{

public partial class Program : UserControl

{

#region MD5 32位加密:GetMd5Str32

/// <summary>

/// 32位MD5加密

/// </summary>

/// <param name="strSource">待加密字串</param>

/// <returns>加密后的字串</returns>

public static string GetMd5Str32(string strSource)

{

byte[] bytes = Encoding.ASCII.GetBytes(strSource)

byte[] hashValue = ((System.Security.Cryptography.HashAlgorithm)System.Security.Cryptography.CryptoConfig.CreateFromName("MD5")).ComputeHash(bytes)

StringBuilder sb = new StringBuilder()

for (int i = 0i <16i++)

{

sb.Append(hashValue[i].ToString("x2"))

}

return sb.ToString().ToUpper()

}

#endregion

#region 核对md5编码是否一致:CheckMd5String()

/// <summary>

/// 核对md5编码是否一致

/// </summary>

/// <param name="ConvertString"></param>

/// <returns>如果一致返回true,否则返回false</returns>

///

public static bool CheckMd5String(string str1, string str2)

{

string md5String = str1//需要验证的字符串

string md5DbString = str2//需要核对的32位md5编码

int result = string.Compare(md5.Program.GetMd5Str32(str1), md5DbString, true)

if (result == 0)

{

return true

}

else

{

return false

}

}

#endregion

}

}

修改“UserControl1.Designer.cs”中的命名空间为“md5”,方法为“Program”,即可生成dll文件。

在...\bin\Debug文件假下,可以找到相应的dll文件。

二、部署dll流程:

首先把dll文件放到应用程序...\bin\Debug\下;

然后在解决方案中添加引用:右键鼠标-->添加引用-->浏览-->选择dll放置路径后点击“确定”。

注意:要在应用文件头处使用using md5;命令。

测试应用程序代码,如下:Form1.cs

using System

using System.Collections.Generic

using System.ComponentModel

using System.Data

using System.Drawing

using System.Text

using System.Windows.Forms

using md5

namespace WindowsApplication1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent()

}

private void button1_Click(object sender, EventArgs e)

{

string str1 = textBox1.Text.ToString()

string md5String = textBox2.Text.ToString()

textBox3.Text = md5.Program.GetMd5Str32(str1)

textBox4.Text = md5.Program.CheckMd5String(str1, md5String).ToString()

}

private void button2_Click(object sender, EventArgs e)

{

this.Close()

}

}

}

关键是 lpOnRecvCardEvent 这个函数的第二个参数是个 C++ 指针。 楼主在 C# 中声明这个导出函数时,使用了并不对应的 CardEvent[] C# 数组类型。 正确的做法是: 在 C# 声明 lpOnRecvCardEvent 时,第二个参数应该是 IntPtr ,不是数组。 由于楼...