然而,在Unity中参考DLL方面我遇到了一些困难。我按照GitHub网站上的说明操作,成功编译了OpenH264Lib.dll(以及示例项目,并且在windows x64上可以通过visual studio 2019运行示例项目并进行编码等操作),但是当我将已编译的
OpenH264Lib.dll
简单拖动到Unity项目的Assets文件夹中的Plugins文件夹中时,我无法访问命名空间OpenH264Lib
,标准C#示例中使用该命名空间来访问托管的函数,控制台仅显示在unity中找不到该命名空间。好吧,所以我决定在visual studio中构建一个C# DLL,它本身加载OpenH264Lib.dll,然后从其中调用其函数,然后在Unity中使用C# DLL,因此这是我的C#代码(之前已将编译好(.NET版本4.6.1)的OpenH264Lib.dll放入Debug文件夹中,就像在示例中一样,在Visual Studio 2019中没有收到任何引用错误):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sayfir
{
public class Class1
{
public static OpenH264Lib.Encoder ok(string path)
{
var code = new OpenH264Lib.Encoder(path);
return code;
}
}
}
好的,完美构建,没有错误,并且似乎与示例文件夹(Assets/Plugins)中的内容相同。
然后,当我将解决方案中 x64/Debug 文件夹下生成的 DLL 文件(OpenH264Lib.dll 和 Sayfir.dll)复制到 Unity 的 Plugins 文件夹中,并尝试在 Unity 中访问它时:
public class Yetzirah {
public static void Wellz() {
var k = Sayfir.Class1.ok("2");
Debug.Log(k);
}
}
我在Unity控制台中收到了一个错误:
Assets\scripts\Yetzirah.cs(45,12): error CS0012: 类型“Encoder”在未被引用的程序集“OpenH264Lib, Version=1.0.7598.38705, Culture=neutral, PublicKeyToken=null”中定义。您必须添加对该程序集的引用。
似乎它识别出了从上面的源代码编译的Sayfir.dll文件,但不认识依赖的OpenH264Lib.dll文件,尽管两者都在同一个文件夹中(在Assets/Plugins中)。
我听说过.rsp文件,但我尝试使用名称为csc.rsp
的文件,并将其添加到Assets文件夹中,内容为
-r:OpenH264Lib
。
仍然没有效果。
同时,我也听说过.asmdef文件,但是当我创建了这样一个文件并添加以下内容时:
{
"references": "OpenH264Lib"
}
但是仍然没有进展,我对asmdef文件并不了解,我也不太清楚这个错误或者在Unity中如何使用托管C++ DLL。
我还看到了一篇文章提到在Unity中引用外部DLL文件,但它说要去
项目>编辑参考>.NET程序集
问题是,我不知道如何在Unity编辑器2020中打开那个界面,或者是否有方法可以实现相同的功能。如果有的话,我不知道该怎么做,在搜索时也无法找到相关信息
我尝试使用标准dllexport创建另一个DLL,使用以下头文件内容:
extern "C" __declspec(dllexport) int well();
接下来在 .cpp 文件中进行操作。
#include "deeall.h"
__declspec(dllexport) int well() {
return 634;
}
然后在Unity中使用C#
DllImport("deeall.dll", EntryPoint="well")]
public static extern int well();
当我仅包含任何类型的托管库时,它可以工作,但是当我将其包含在dll中时,就会出现错误:“__declspec(dllexport)”不能应用于使用“__clrcall”调用约定的函数。
如果我想要为C#包装器使用__declspec导出,这是必需的。
作为一种方式,我试图向Encoder.cpp文件本身(来自OpenH264Lib.dll的源代码)添加以下内容:
__declspec(dllexport) int well() {
String ^h = "ok";
Encoder
^enc =
gcnew Encoder(
h
);
return 4;
}
尝试直接调用Encoder函数,(以及对Encoder.h文件头的以下修改:
namespace OpenH264Lib {
extern "C" __declspec(dllexport) int well();
//etc.. rest of code in namespace.....
然后在Unity中进行操作。
[DllImport("OpenH264Lib6.dll", EntryPoint="well")]
public static extern int well();
但是当我调用well()
时,Unity会暂停一段时间然后崩溃,没有任何错误信息
那么我该如何在Unity中让OpenH264Lib.dll工作,或者让其他类似的托管编译过的C++ DLL在Unity中工作呢?如果这不可能,那么我是否可以以其他方式在Unity中使用OpenH264?如果不能,那么在Unity中实时编码H264视频的其他解决方案有哪些(从byte[]s)?
Dispose
,但它不能解决你的问题(它仅是一个异常安全的Dispose
语句)。 - Cleptus