有没有一种方法可以防止在 Unity 中为 IL2CPP 编译器剥离程序集以使用 AWS Gamelift API?

Is there a way to prevent assembly stripping in Unity for the IL2CPP compiler in order to use the AWS Gamelift API?

显然 AWS Gamelift API 使用反射或某种机制导致 Unity 编译器过度积极地剥离所需的程序集。因此,您只能使用允许关闭剥离的 Mono 编译器。 IL2CPP 没有类似的选项。对于 IL2CPP,您可以通过 link.xml 文件 (\Assets\link.xml) 中的条目来控制剥离。到目前为止,我还没有成功使用 link.xml 方法。

在link.xml中使用下面的条目后,一些异常被阻止了,但这个异常仍然存在。

2020-03-16 12:12:14.622 13883-13898/com.company.app E/Unity: NotSupportedException: System.Configuration.ConfigurationManager::get_AppSettings 在 System.Configuration.ConfigurationManager.get_AppSettings () [0x00000] 在 <000000000000000000000000000000000>:0 在 Amazon.AWSConfigs.GetConfig(System.String 名称)[0x00000] 在 <00000000000000000000000000000000>:0 在 Amazon.AWSConfigs..cctor () [0x00000] 在 <00000000000000000000000000000000>:0 在 Amazon.Runtime.ClientConfig..ctor () [0x00000] 在 <00000000000000000000000000000000>:0 在 Amazon.GameLift.AmazonGameLiftConfig..ctor () [0x00000] 在 <00000000000000000000000000000000>:0 在 Amazon.GameLift.AmazonGameLiftClient..ctor(System.String awsAccessKeyId,System.String awsSecretAccessKey,Amazon.RegionEndpoint 区域)<000000000000000000000000000000000> 中的 [0x00000]:0 在 GameLiftClient.GetConnectionInfo (System.String& ip, System.Int32& 端口, System.String& playerSessionId) [0x00000] 在 <000000000000000000000000000000000>:0 在 GameLift.GetConnectionInfo(System.String& ip,System.Int32& 端口,System.String

link.xml

<linker>
  <assembly fullname="UnityEngine">
    <type fullname="UnityEngine.Networking.UnityWebRequest" preserve="all" />
    <type fullname="UnityEngine.Networking.UploadHandlerRaw" preserve="all" />
    <type fullname="UnityEngine.Networking.UploadHandler" preserve="all" />
    <type fullname="UnityEngine.Networking.DownloadHandler" preserve="all" />
    <type fullname="UnityEngine.Networking.DownloadHandlerBuffer" preserve="all" />
  </assembly>
  <assembly fullname="mscorlib">
      <namespace fullname="System.Security.Cryptography" preserve="all"/>
  </assembly>
  <assembly fullname="System">
      <namespace fullname="System.Security.Cryptography" preserve="all"/>
  </assembly>
  <assembly fullname="AWSSDK.Core" preserve="all"/>
  <assembly fullname="AWSSDK.CognitoIdentity" preserve="all"/>
  <assembly fullname="AWSSDK.CognitoSync" preserve="all"/>
  <assembly fullname="AWSSDK.DynamoDBv2" preserve="all"/>
  <assembly fullname="AWSSDK.Kinesis" preserve="all"/>
  <assembly fullname="AWSSDK.KinesisFirehose" preserve="all"/>
  <assembly fullname="AWSSDK.Lambda" preserve="all"/>
  <assembly fullname="AWSSDK.MobileAnalytics" preserve="all"/>
  <assembly fullname="AWSSDK.S3" preserve="all"/>
  <assembly fullname="AWSSDK.SecurityToken" preserve="all"/>
  <assembly fullname="AWSSDK.SimpleEmail" preserve="all"/>
  <assembly fullname="AWSSDK.SimpleNotificationService" preserve="all"/>
  <assembly fullname="AWSSDK.SQS" preserve="all"/>
  <assembly fullname="AWSSDK.IdentityManagement" preserve="all"/>
  <assembly fullname="AWSSDK.GameLift" preserve="all"/>
  <assembly fullname="System.Configuration" preserve="all"/>
  <assembly fullname="System.SecurityUtils" preserve="all"/>
  <assembly fullname="System.ComponentModel" preserve="all"/>
  <assembly fullname="System.Activator" preserve="all"/>
  <assembly fullname="System.RuntimeType" preserve="all"/>
</linker>

是否有使用 link.xml 或其他机制禁用 Unity 中的程序集剥离以便可以使用 IL2CPP 编译器的方法?

这个错误实际上与托管代码剥离无关。发生这种情况是因为 IL2CPP 不支持 System.Configuration.ConfigurationManager.

您需要查看是否可以在不访问配置管理器的情况下使用 AWS Gamelift API API。

根据 Josh Peterson 的回答,解决方案是使用 link.xml 文件来防止剥离并使用不包含系统的 AWSSDK.Core 和 AWSSDK.GameLift 库的修改版本配置管理器。

以下分叉版本的 AWSSDK GitHub 项目的全部目的是解决针对 IL2CPP 编译和使用 GameLift 的问题。

https://github.com/fixstu/aws-sdk-net

首先构建 AWSSDK.Core.Net45.csproj,然后构建 AWSSDK.GameLift.Net35.csproj,两个必要的库都将输出到 /sdk/src/Services/GameLift/目录。

将输出二进制文件添加到 Unity 项目的 /Assets/Plugin 目录,将 link.xml 添加到 /Assets 目录...IL2CPP 将无一例外地编译和 运行 GameLift 命令。