编译注册 C# 代码
compileCsharp 接口用于将 C# 源代码编译,并返回一个唯一的函数 ID(funid),供后续调用使用。
接口说明
接口类型
compileCsharp参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
code | string | ✅ | C# 源代码字符串 |
refs | string[] | ❌ | 托管 DLL 文件路径数组 |
返回值
返回一个字符串类型的 funid(函数 ID),用于后续通过 executeCsharp 接口调用该函数。
基本使用
简单示例
javascript
// 编译并注册一个简单的 C# 函数
const funid = await apiInvoke("compileCsharp", {
code: `
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using OpenCvSharp;
//加载非托管DLL
public static class User32
{
[DllImport("user32.dll")]
public static extern int MessageBox(IntPtr hWnd, string text, string caption, uint type);
}
public class Startup
{
public async Task<object> Invoke(dynamic args)
{
//获取参数
byte[] screenShotImage = (byte[])args.screenshot;
int inta = (int)args.inta;
float floatb = (float)args.floatb;
User32.MessageBox(IntPtr.Zero, "OpenCvSharp和user32都已加载", "提示", 0);
//......
return inta + floatb;
}
}
`,
//这里只允许托管dll文件
refs: ["D:\\opencv\\OpenCvSharp.dll"]
})
console.log('funid', funid)
// 输出: 函数 ID: abc123def456...注意事项
⚠️ 重要限制
托管 DLL 限制
refs参数只能引用托管 DLL(.NET 程序集)- 非托管 DLL,需使用
DllImport
类名和方法名固定
- 类名必须是
Startup - 方法名必须是
Invoke - 签名必须是
public async Task<object> Invoke(dynamic args)
- 类名必须是
命名空间引用
- 必须显式引用需要的命名空间(如
using System;) - 不会自动引用所有命名空间
- 必须显式引用需要的命名空间(如
编译错误处理
如果编译失败,接口会抛出异常。
下一步
编译完成后,使用返回的 funid 调用函数:
查看 执行 C# 函数 了解如何调用已编译的函数。