Go 程序编译成 DLL 供 C# 调用。

 

阅读目录

阅读目录

 Go 程序编译成 DLL 供 C# 调用。

回到目录

C# 结合 Golang 开发

 

返回顶部

1. 实现方式与语法形式

基本方式:将 Go 程序编译成 DLL 供 C# 调用。

1.1 Go代码

注意:代码中 export 的注释是定义的入口描述不能省略

package main

import "C"
import "fmt"

func main() {
    fmt.Println(Test())
}

var _count = 0

//Test :
//export Test
func Test() int {
    _count++
    return _count
}

在 LiteIDE 中将编译配置的 BUILDARGS 自定义值为 --buildmode=c-shared -o Test.dll,从而形成以下编译语句。

go build --buildmode=c-shared -o Test.dll

1.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.html

返回顶部

3. 操作系统 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.dll
(2)定义 ITest 接口,将 DLL 将要调用的方法定义为接口方法
(3)分别为ITest接口实现 Test32 与 Test64 类,在类中加载相应的 DLL
(4)通过判断操作系统类型,实例化一个 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 struct
    GO 定义示例
//Hello :
//export Hello
func 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 转 String

public 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", "cgocheck=0");

返回顶部

6. 相关参考

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
NET程序员的开发利器.NET Reflector 一、 简介   程序集,作为.NET时代的动态链接库,蕴藏了太多的软件秘密。为此,Visual Studio内置的ILDASM成为最初挖掘程序集的上佳工具。但自从Reflector出现后,ILDASM相形见拙。因为,Reflector能提更多的程序集信息,而且是免费的工具。   如今,在Visual Studio.NET中编译源代码(无论是VB还是C#)时,编译器都会将高级源代码翻译成MSIL,即“微软中间语言”,而不是特定的机器指令。具有更多安全性、版本控制、共享能力与其它相关元数据的中间语言(IL),是包在一个或多个DLL或可执行文件中的。   基于ILDASM检查程序集中的IL有时很有用,但它要求我们熟悉MSIL。通常,比起IL,大多数开发人员对像C#或Visual Basic这样的高级程序设计语言更为熟悉。   Reflector的出现使.NET程序员眼前豁然开朗,因为这个免费工具可以将.NET程序集中的中间语言反编译成C#或者Visual Basic代码。除了能将IL转换为C#或Visual Basic以外,Reflector还能够提程序集中类及其成员的概要信息、提查看程序集中IL的能力以及提对第三方插件的支持。   二、 下载与运行Reflector   Reflector是由微软员工Lutz Roeder编写的免费程序。这个软件经常更新,你可以在http://www.aisto.com/roeder/dotnet下载最新的版本。在本文成文之时,Reflector的最新版本为5.0.35.0,仅有1M大小。只要双击下载后的Reflector.exe文件即可运行Reflector。   默认情况下,Reflector会打开一组公共程序集(mscorlib、System、System.Data、System.Drawing等等)。每个打开的程序集都列在Reflector的主窗口中。单击程序集旁边的+图标可以展开树结构并展示程序集的命名空间。每个命名空间旁边都有一个相关的+图标,单击这个图标将显示这个命名空间内的类。除此以外,还可以展开每个类,显示类的成员:事件、字段、方法与属性。   要想查看其它程序集(包括我们自己创建的程序集)的细节,你可以使用菜单命令“File→Open”。然后,浏览到想要查看的程序集。只要选择了有效的.NET程序集,这个程序集就可以在Reflector的主窗口中与其它默认程序集共同显示。要想从Reflector的主窗口中删除程序集,只需右击程序集并选择“Close”。   三、 使用Reflector反汇编程序集   提基本的程序集是Reflector唾手可得的功能,然而,Reflector真正的威力体现在它的反汇编能力。只要浏览到类级的成员,就可以通过Tools菜单中的Disassembler项(或在该项上单击右键)反汇编此成员。这将打开第二个窗格,以C#、Visual Basic、Delphi或者IL显示反汇编后的内容。图2以C#语言展示了对SmtpClient类中Abort方法的反汇编结果。   有了Reflector的反编译功能,要研究.NET框架基类库就容易多了。我们完全可以在没有源代码的情况下研究我们所创建或者正在使用的程序集相应源代码。   不用太担心,你自己的.NET应用程序还有其它受保护措施。但是,想阻止别人查看.NET程序集的IL(继而反编译成C#或者Visual Basic)是不可能的,但你可以使用“混淆”技术使IL变得混乱。目前,市场上有许多.NET混淆产品,比如:PreEmptive Solution的Dotfuscator、WiseOwl的Dmeanor以及Remotesoft的.NET Obfuscator等。   四、 Reflecator的其它功能   除了作为对象浏览器与反汇编器之外,Reflector还可以显示类与其成员的调用与被调用图、提单键访问Google或MSDN搜索的能力并提了允许第三方开发人员为Reflector创建插件的框架。   要查看调用或被调用图,只需要在树视图中选择一个成员,访问Tools菜单,选择Call Graph或Callee Graph选项即可。Call Graph会列出所选项所调用的成员,而Callee Graph列出调用所选项的成员。   通过使用插件,Reflector的功能可以得到进一步扩展。目前有能显示程序集依赖图、自动加载当前运行中的程序集、输出整个程序集的反汇编内容以及在Visual Studio中作为Reflector的宿主等的插件。还有更多插件都列在http://www.codeplex.com/reflectoraddins中。在此,我极力推荐有兴趣的读者前去一看。   不出乎所料,的确存在一个Reflector.VisualStudio插件。有了这个插件,就可以让Reflector集成在Visual Studio环境中,进而取代以前那个有些“拙漏”的对象浏览器。   首先,我们需要在机器上准备Reflector的最新版,然后从http://www.testdriven.NET/reflector下载最新版本的Reflector.VisualStudio插件。据说安装了此插件之后,Reflector能够与Visual Studio完美融合。但遗憾的是,本人试下载此软件并安装(仅能得到TestDriven.NET-2.8.2130 RTM个人测试版本,时间7/30/2007,大小3.3M)后,没有大发现—仅是在VS2005中添加“Go to Reflector”和一个帮助菜单项。点击“Go to Reflector”菜单项仅是从VS2005内部启动Reflector而已。   有了Reflector.VisualStudio插件(正版,下面是根据在线资料介绍),Reflector可以寄在Visual Studio中Reflector不仅是一个对象浏览器、反汇编器,包裹在同一个程序中的所有功能还可以寄于Visual Studio中。   五、 小结   还记得Spy++吗?在Win32时代,这个软件对于我们分析一个陌生软件的设计思路可谓立下汗马功劳。在如今的.NET时代,Reflector又成为每个严肃的.NET开发人员工具箱中必不可少的精髓工具之一。怎么样,请赶紧试锋吧。
NET程序员的开发利器.NET Reflector 一、 简介   程序集,作为.NET时代的动态链接库,蕴藏了太多的软件秘密。为此,Visual Studio内置的ILDASM成为最初挖掘程序集的上佳工具。但自从Reflector出现后,ILDASM相形见拙。因为,Reflector能提更多的程序集信息,而且是免费的工具。   如今,在Visual Studio.NET中编译源代码(无论是VB还是C#)时,编译器都会将高级源代码翻译成MSIL,即“微软中间语言”,而不是特定的机器指令。具有更多安全性、版本控制、共享能力与其它相关元数据的中间语言(IL),是包在一个或多个DLL或可执行文件中的。   基于ILDASM检查程序集中的IL有时很有用,但它要求我们熟悉MSIL。通常,比起IL,大多数开发人员对像C#或Visual Basic这样的高级程序设计语言更为熟悉。   Reflector的出现使.NET程序员眼前豁然开朗,因为这个免费工具可以将.NET程序集中的中间语言反编译成C#或者Visual Basic代码。除了能将IL转换为C#或Visual Basic以外,Reflector还能够提程序集中类及其成员的概要信息、提查看程序集中IL的能力以及提对第三方插件的支持。   二、 下载与运行Reflector   Reflector是由微软员工Lutz Roeder编写的免费程序。这个软件经常更新,你可以在http://www.aisto.com/roeder/dotnet下载最新的版本。在本文成文之时,Reflector的最新版本为5.0.35.0,仅有1M大小。只要双击下载后的Reflector.exe文件即可运行Reflector。   默认情况下,Reflector会打开一组公共程序集(mscorlib、System、System.Data、System.Drawing等等)。每个打开的程序集都列在Reflector的主窗口中。单击程序集旁边的+图标可以展开树结构并展示程序集的命名空间。每个命名空间旁边都有一个相关的+图标,单击这个图标将显示这个命名空间内的类。除此以外,还可以展开每个类,显示类的成员:事件、字段、方法与属性。   要想查看其它程序集(包括我们自己创建的程序集)的细节,你可以使用菜单命令“File→Open”。然后,浏览到想要查看的程序集。只要选择了有效的.NET程序集,这个程序集就可以在Reflector的主窗口中与其它默认程序集共同显示。要想从Reflector的主窗口中删除程序集,只需右击程序集并选择“Close”。   三、 使用Reflector反汇编程序集   提基本的程序集是Reflector唾手可得的功能,然而,Reflector真正的威力体现在它的反汇编能力。只要浏览到类级的成员,就可以通过Tools菜单中的Disassembler项(或在该项上单击右键)反汇编此成员。这将打开第二个窗格,以C#、Visual Basic、Delphi或者IL显示反汇编后的内容。图2以C#语言展示了对SmtpClient类中Abort方法的反汇编结果。   有了Reflector的反编译功能,要研究.NET框架基类库就容易多了。我们完全可以在没有源代码的情况下研究我们所创建或者正在使用的程序集相应源代码。   不用太担心,你自己的.NET应用程序还有其它受保护措施。但是,想阻止别人查看.NET程序集的IL(继而反编译成C#或者Visual Basic)是不可能的,但你可以使用“混淆”技术使IL变得混乱。目前,市场上有许多.NET混淆产品,比如:PreEmptive Solution的Dotfuscator、WiseOwl的Dmeanor以及Remotesoft的.NET Obfuscator等。   四、 Reflecator的其它功能   除了作为对象浏览器与反汇编器之外,Reflector还可以显示类与其成员的调用与被调用图、提单键访问Google或MSDN搜索的能力并提了允许第三方开发人员为Reflector创建插件的框架。   要查看调用或被调用图,只需要在树视图中选择一个成员,访问Tools菜单,选择Call Graph或Callee Graph选项即可。Call Graph会列出所选项所调用的成员,而Callee Graph列出调用所选项的成员。   通过使用插件,Reflector的功能可以得到进一步扩展。目前有能显示程序集依赖图、自动加载当前运行中的程序集、输出整个程序集的反汇编内容以及在Visual Studio中作为Reflector的宿主等的插件。还有更多插件都列在http://www.codeplex.com/reflectoraddins中。在此,我极力推荐有兴趣的读者前去一看。   不出乎所料,的确存在一个Reflector.VisualStudio插件。有了这个插件,就可以让Reflector集成在Visual Studio环境中,进而取代以前那个有些“拙漏”的对象浏览器。   首先,我们需要在机器上准备Reflector的最新版,然后从http://www.testdriven.NET/reflector下载最新版本的Reflector.VisualStudio插件。据说安装了此插件之后,Reflector能够与Visual Studio完美融合。但遗憾的是,本人试下载此软件并安装(仅能得到TestDriven.NET-2.8.2130 RTM个人测试版本,时间7/30/2007,大小3.3M)后,没有大发现—仅是在VS2005中添加“Go to Reflector”和一个帮助菜单项。点击“Go to Reflector”菜单项仅是从VS2005内部启动Reflector而已。   有了Reflector.VisualStudio插件(正版,下面是根据在线资料介绍),Reflector可以寄在Visual Studio中Reflector不仅是一个对象浏览器、反汇编器,包裹在同一个程序中的所有功能还可以寄于Visual Studio中。   五、 小结   还记得Spy++吗?在Win32时代,这个软件对于我们分析一个陌生软件的设计思路可谓立下汗马功劳。在如今的.NET时代,Reflector又成为每个严肃的.NET开发人员工具箱中必不可少的精髓工具之一。怎么样,请赶紧试锋吧。
++++调++调用++调用的++调用的步++调用的步骤++调用的步骤是++调用的步骤是什++调用的步骤是什么++调用的步骤是什么? ++调用的步骤是什么? 将++调用的步骤是什么? 将YO++调用的步骤是什么? 将YOLO++调用的步骤是什么? 将YOLO的++调用的步骤是什么? 将YOLO的模++调用的步骤是什么? 将YOLO的模型++调用的步骤是什么? 将YOLO的模型文件++调用的步骤是什么? 将YOLO的模型文件和++调用的步骤是什么? 将YOLO的模型文件和权++调用的步骤是什么? 将YOLO的模型文件和权重++调用的步骤是什么? 将YOLO的模型文件和权重文件++调用的步骤是什么? 将YOLO的模型文件和权重文件转++调用的步骤是什么? 将YOLO的模型文件和权重文件转换++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Dark++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Dark++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成Tensor++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合Tensor++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dll++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dll++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用,++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用,可以++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用,可以使用++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用,可以使用Visual++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用,可以使用Visual Studio++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用,可以使用Visual Studio等++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用,可以使用Visual Studio等工++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用,可以使用Visual Studio等工具++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用,可以使用Visual Studio等工具进行++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用,可以使用Visual Studio等工具进行编++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用,可以使用Visual Studio等工具进行编译++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用,可以使用Visual Studio等工具进行编译打++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用,可以使用Visual Studio等工具进行编译打包++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用,可以使用Visual Studio等工具进行编译打包生成++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用,可以使用Visual Studio等工具进行编译打包生成.dll++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用,可以使用Visual Studio等工具进行编译打包生成.dll动++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用,可以使用Visual Studio等工具进行编译打包生成.dll动态++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用,可以使用Visual Studio等工具进行编译打包生成.dll动态链接++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用,可以使用Visual Studio等工具进行编译打包生成.dll动态链接库++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用,可以使用Visual Studio等工具进行编译打包生成.dll动态链接库文件++调用的步骤是什么? 将YOLO的模型文件和权重文件转换成Darknet的模型文件格式,利用Darknet.dll库中提的函数读取模型文件和权重文件,实现检测。然后将该模型文件转换成TensorRT支持的格式,再结合TensorRT中的API进行调用。最后,如果需要将其转为dllC++调用,可以使用Visual Studio等工具进行编译打包生成.dll动态链接库文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值