Xamarin.android 如何在xamarin android项目中处理多个应用程序类
我需要使用一个第三方库,其中包括一个用[Application]属性修饰的类。这会导致编译器错误,因为我有自己的应用程序类使用[application]属性。我希望我的应用程序类从第三方库的应用程序类继承Xamarin.android 如何在xamarin android项目中处理多个应用程序类,xamarin.android,Xamarin.android,我需要使用一个第三方库,其中包括一个用[Application]属性修饰的类。这会导致编译器错误,因为我有自己的应用程序类使用[application]属性。我希望我的应用程序类从第三方库的应用程序类继承 public class MyApplication : ThirdPartyApplication { } 然而,由于我不能用[Application]属性修饰我的类,我无法在清单中指定它应该运行“MyApplication”而不是“ThirdPartyApplication” 如果我手动
public class MyApplication : ThirdPartyApplication
{
}
然而,由于我不能用[Application]属性修饰我的类,我无法在清单中指定它应该运行“MyApplication”而不是“ThirdPartyApplication”
如果我手动将条目添加到AndroidManifest.xml中
<application
android:name="com.your.packagename.MyApplication"
android:icon="@drawable/luncher_icon"
android:label="@string/app_name">
所以我能够想出一个解决方案,但它是一个黑客
简而言之,将使用MSBuild修改android清单
步骤1:让您的自定义应用程序类继承第三方库的自定义应用程序,并用“Register”标记装饰您的类
步骤2:让您的项目包含RoslynCodeTaskFactory NuGet包
步骤3:卸载项目,然后在项目标签中添加以下内容
<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]。您使用的是哪个库它是供应商提供的专有库,用于控制他们设计的某些硬件。
[Register("com.namespace.MyApplication")]
public class MyApplication : ThirdPartyApplication
{
}
<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>