我需要使用第三方库,其中包括使用[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。
答案 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]。