电影网站织梦模版,广州比较好的网站建设,成都快速建站公司,怎样做自己的网站1. 实现方式与语法形式基本方式#xff1a;将 Go 程序编译成 DLL 供 C# 调用。1.1 Go代码注意#xff1a;代码中 export 的注释是定义的入口描述不能省略package mainimport Cimport fmtfunc main() { fmt.Println(Test())}var _count 0//Test :… 1. 实现方式与语法形式基本方式将 Go 程序编译成 DLL 供 C# 调用。1.1 Go代码注意代码中 export 的注释是定义的入口描述不能省略package mainimport Cimport fmtfunc main() { fmt.Println(Test())}var _count 0//Test ://export Testfunc Test() int { _count return _count}在 LiteIDE 中将编译配置的 BUILDARGS 自定义值为 --buildmodec-shared -o Test.dll从而形成以下编译语句。go build --buildmodec-shared -o Test.dll1.2 C# 代码[DllImport(Test.dll, EntryPoint Test)]extern static int Test();2. Windows 下编译依赖的环境生成 DLL 依赖于 gcc没有 gcc 环境时会报以下错误gcc: executable file not found in %PATH%GCC下载Windows 64位版本 || Windows 32位版本也可以从从云盘下载。下载之后解压后确保 gcc 命令在搜索路径Path中。更多信息可参考https://www.cnblogs.com/ghj1976/p/3540257.html3. 操作系统 64 位与 32 的编译在 LiteIDE 中可以通过配置 win32.env 和 win64.env 来指定不同的 gcc 环境路径达到生成指定系统的 DLL 文件。4. c# 中操作系统 64 位与 32 的适配在 c# 中判断操作系统是否 64 位可以使用以下语句。bool is64 Environment.Is64BitOperatingSystem;为了在不同的操作系统下加载不同的 DLL采取以下步骤来进行组织。1将 32 位的版本命名为 Test32.dll将 64 位的版本命名为 Test64.dll2定义 ITest 接口将 DLL 将要调用的方法定义为接口方法3分别为ITest接口实现 Test32 与 Test64 类在类中加载相应的 DLL4通过判断操作系统类型实例化一个 ITest 的具体实现类实例来使用具体接口与类实现代码如下public interface ITest{ int Test();}public class Test32 : ITest{ class TestDLL { const string DLL_NAME Test32.dll; [DllImport(DLL_NAME, EntryPoint Test)] public extern static int Test(); } public int Test() { return TestDLL.Test(); }}public class Test64 : ITest{ class TestDLL { const string DLL_NAME Test64.dll; [DllImport(DLL_NAME, EntryPoint Test)] public extern static int Test(); } public int Test() { return TestDLL.Test(); }}实例化与调用ITest test Environment.Is64BitOperatingSystem ? (ITest)new Test64() : (ITest)new Test32();int result test.Test();5. 其它一些问题5.1 字符串转换传入字符串C#: byte[] - GO: *C.char接收字符串GO: string - C#: GoString structGO 定义示例//Hello ://export Hellofunc Hello(name *C.char) string { return fmt.Sprintf(hello %s, C.GoString(name))}C# GoString struct 定义public struct GoString{ public IntPtr p; public int n; public GoString(IntPtr n1, int n2) { p n1; n n2; }}C# DllImport 声明[DllImport(DLL_NAME, EntryPoint Hello, CallingConvention CallingConvention.Cdecl)]public extern static GoString Hello(byte[] name);C# GoString struct 转 Stringpublic string GoStringToCSharpString(GoString goString){ byte[] bytes new byte[goString.n]; for (int i 0; i goString.n; i) { bytes[i] Marshal.ReadByte(goString.p, i); } string result Encoding.UTF8.GetString(bytes); return result;}C# 调用示例GoString goResult test.Hello(Encoding.UTF8.GetBytes(张三));Debug.WriteLine(GoStringToCSharpString(goResult));5.2 调试CallingConvention在声明中加入 CallingConvention CallingConvention.Cdecl 避免未知异常。[DllImport(Test.dll, CallingConvention CallingConvention.Cdecl)]程序崩溃甚至异常提示都没有可在加载 DLL 之前Environment.SetEnvironmentVariable(GODEBUG, cgocheck0);6. 相关参考GO 生成 DLLC# 调用的一个完整小示例https://github.com/Baozisoftware/go-dll字符串处理相关的一个问答https://stackoverflow.com/questions/48208098/using-generated-golang-dll-to-return-string-or-c-char