由于类型加载错误,Unity3D中的AudioGraph TypeLoadException无法找到方法

时间:2018-01-03 11:51:36

标签: c# .net unity3d dll

我尝试使用Unity3D开发应用程序,Unity3D必须访问麦克风并在套接字上发送捕获的音频。 我想在Hololens上运行这个应用程序。

我已经看到Unity的Microphone类没有自动检测句子结尾的方法,所以我想使用Windows.Media.Audio命名空间中的AudioGraph类,我在这里使用它。已经用于UWP项目;这是因为AudioGraph类自动检测句子的结尾并创建一个我可以在套接字上写的音频片段。

我已经创建了一个暴露某些功能的类库,我希望将它用作Unity中的托管插件。 我面临的问题是类库是在Unity编辑器中成功构建和导入的,但是当我运行Unity项目时,这将失败:

  

TypeLoadException:由于类型加载错误而无法找到方法

OR

  

TypeLoadException:加载类型加载时发生失败

我发现此错误是由我在托管插件中的声明引起的:

AudioGraph graph;

删除每个引用并调用AudioGraph实例或方法,托管插件将正常工作,只有在调用属于Windows.Media.Audio的类时,插件才会失败。

作为测试,我在插件中添加了此方法:

public int c;

public void AddValues(int a, int b)
{
        c = a + b;
}

从Unity脚本执行此调用我不会收到错误:

UWPUtilities utils = new UWPUtilities();
Debug.Log("Generated random: " + utils.GenerateRandom(1, 99));

在dll项目中使用AudioGraph的实例,统一调试器甚至不会重新实现UWPUtilities的实例化,它会抛出TypeLoadException

我如何使用AudioGraph类或Windows.Media.Audio命名空间中的每个类? 这种方法是否可行o我必须使用Unity的麦克风类并自己实现静音检测功能吗?

1 个答案:

答案 0 :(得分:0)

AudioGraph是一个UWP API。您的Unity项目是否针对UWP?我觉得它不是。

我不认为可以在Unity桌面应用程序中直接从Unity C#脚本中使用AudioGraph;我认为该配置中使用的Mono运行时无法连接到AudioGraph服务。由于这也是Unity Player中使用的运行时,我认为你在Unity内部播放场景时也无法使用AudioGraph。

但是,如果您的应用可以选择定位UWP,那么您的赔率就会提高。我实际上成功地创建了一个使用AudioGraph进行声音的UWP目标Unity项目。我必须:

  • 使用Unity应用程序所需的声音操作创建一个界面,并将此界面添加到Unity项目,以及一个静态字段,其中包含"当前的声音界面"
  • 创建默认情况下使用的界面的模拟实现,当在Unity中播放应用程序时(这让我可以使用Unity来测试除声音之外的所有内容)
  • 使用AudioGraph创建一个单独的UWP .NET C#DLL项目来实现接口;将项目添加到Unity生成的UWP解决方案
  • 修改主UWP应用程序代码以更新静态"当前声音界面"字段,这样当在UWP下运行时,接口通过DLL
  • 将声音操作路由到AudioGraph

这确实奏效了。我正在修改它,因为我决定我不希望我的核心音频处理在C#中。我还想要一个适用于桌面和UWP的解决方案,而这个解决方案却没有。我目前正在尝试决定是否围绕AudioGraph编写P / Invoke C ++包装器,或者编写基于WASAPI的P / Invoke C ++库。无论哪种方式,一旦我有一些东西,主持人允许,我会用链接更新这个答案。