你如何在xamarin android项目中处理多个应用程序类

时间:2018-06-07 14:33:56

标签: xamarin.android

我需要使用第三方库,其中包括使用[Application]属性修饰的类。这会导致编译器错误,因为我有自己的应用程序类使用[Application]属性。我希望我的应用程序类继承自第三方lib的应用程序类。

public class MyApplication : ThirdPartyApplication
{
}

但是由于我无法使用[Application]属性来装饰我的类,所以我无法在Manifest中指定它应该运行" MyApplication"而不是" ThirdPartyApplication"。

如果我手动将条目添加到AndroidManifest.xml

<application
    android:name="com.your.packagename.MyApplication"
    android:icon="@drawable/luncher_icon"
    android:label="@string/app_name">

在使用

构建项目后,它将被替换
<application
    android:name="mdxxx.ThirdPartyApplication"
    android:icon="@drawable/luncher_icon"
    android:label="@string/app_name">

有没有人知道如何在Xamarin Android中处理这种情况?

请注意,无法修改第三方库。

另一种解决方案是禁用所有清单生成属性并手动创建AndroidManifest的方法。似乎没有办法做到这一点。

以下帖子是我所拥有的确切情况,但在纯Android中。请注意,由于上述问题,此解决方案不适用于Xamarin。

how-to-handle-multiple-application-classes-in-android

1 个答案:

答案 0 :(得分:0)

所以我能够找到一个解决方案,但它可以成为一个黑客。

简而言之,Android清单将使用MSBuild进行修改。

第1步:让您的自定义应用程序类继承自第三方lib的自定义应用程序,并使用&#34; Register&#34;来装饰您的班级。标签

[Register("com.namespace.MyApplication")]
public class MyApplication : ThirdPartyApplication
{
}

第2步:让您的项目包含RoslynCodeTaskFactory NuGet包

第3步:卸载项目,然后在Project标记中添加以下内容

<UsingTask TaskName="UpdateManifest" TaskFactory="CodeTaskFactory" AssemblyFile="$(RoslynCodeTaskFactory)" Condition=" '$(RoslynCodeTaskFactory)' != '' ">
<ParameterGroup>
  <AndroidManifestFilename ParameterType="System.String" Required="true" />
  <ApplicationName ParameterType="System.String" Required="true" />
</ParameterGroup>
<Task>
  <Reference Include="System.Core" />
  <Using Namespace="System" />
  <Using Namespace="System.Xml" />
  <Code Type="Fragment" Language="cs"><![CDATA[
        XmlDocument doc = new XmlDocument();
        doc.Load(AndroidManifestFilename);
        XmlNode node = doc.DocumentElement.SelectSingleNode("/manifest/application");
        node.Attributes["android:name"].InnerText = ApplicationName;
        doc.Save(AndroidManifestFilename);
      ]]></Code>
</Task>
</UsingTask>
<Target Name="CleanManifest" AfterTargets="_GenerateJavaStubs">
   <UpdateManifest AndroidManifestFilename="$(ProjectDir)\obj\$(Configuration)\android\AndroidManifest.xml" ApplicationName="com.namespace.MyApplication" />
</Target>

第4步:重新加载项目并构建。清单现在应该指向自定义应用程序类。如果你得到一个未找到类的运行时异常,你很可能忘记在步骤1中添加[Register]。