来自 Visual Studio 的配置转换 (Xamarin)
Config Transformations From Visual Studio (Xamarin)
我正在尝试对 Visual Studio 内的 Xamarin.Android 项目中的 Android.Manifest 文件实施预构建转换 - 目的只是更改我的应用程序的 bundleID取决于我是构建调试版还是发布版。
我在我的解决方案中添加了一个新的 .netFramework 项目,引用了 Microsoft.Build,然后添加了一个名为 BuildTask 的新 class 并在我的 Xamarin.Android 项目中引用了 DLL。
然后我打算将 UsingTask 添加到我的 Xamarin.Android 项目的 .csproj 文件的最底部,就在结束标记的上方 - 我认为这是正确的。
在我添加 UsingTask 之前,我想确保构建 Xamarin.Android 项目,但不幸的是,我在我的 Xamarin.Android 项目中收到有关缺少引用的错误,说我缺少引用到 System.Collections,但是当我删除对新 BuildTask.DLL
的引用时错误消失了
我以前从未这样做过,所以我可能会陷入困境...如果有人有任何建议,我们将不胜感激。
这是我的 BuildTask class 供参考:
using System;
using Microsoft.Build.Utilities;
using Microsoft.Build.Framework;
using System.Xml;
public class BuildTask : Task
{
private const string AndroidNamespace = "http://schemas.android.com/apk/res/android";
[Required]
public string PackageName { get; set; }
[Required]
public string ApplicationLabel { get; set; }
[Required]
public string ManifestFilename { get; set; }
public string Debuggable { get; set; }
public override bool Execute()
{
var xml = new XmlDocument();
xml.Load(ManifestFilename);
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);
nsmgr.AddNamespace("android", AndroidNamespace);
if (xml.DocumentElement != null)
{
xml.DocumentElement.SetAttribute("package", PackageName);
var appNode = xml.DocumentElement.SelectSingleNode("/manifest/application", nsmgr);
if (appNode != null && appNode.Attributes != null)
{
var labelAttribute = appNode.Attributes["label", AndroidNamespace];
if (labelAttribute != null)
{
labelAttribute.Value = ApplicationLabel;
}
var debuggableAttribute = appNode.Attributes["debuggable", AndroidNamespace];
if (debuggableAttribute != null)
{
debuggableAttribute.Value = Debuggable;
}
xml.Save(ManifestFilename);
return true;
}
}
return false;
}
}
谢谢。
那是因为您将完整的 .NET Framework 引用到 Xamarin.Android 项目。 这个完整的 .NET 框架与 Xamarin.Android 不兼容。 您应该使用以下之一:
创建一个 Android 库项目。
创建便携式 Class 库项目。
创建共享项目。
我正在尝试对 Visual Studio 内的 Xamarin.Android 项目中的 Android.Manifest 文件实施预构建转换 - 目的只是更改我的应用程序的 bundleID取决于我是构建调试版还是发布版。
我在我的解决方案中添加了一个新的 .netFramework 项目,引用了 Microsoft.Build,然后添加了一个名为 BuildTask 的新 class 并在我的 Xamarin.Android 项目中引用了 DLL。
然后我打算将 UsingTask 添加到我的 Xamarin.Android 项目的 .csproj 文件的最底部,就在结束标记的上方 - 我认为这是正确的。
在我添加 UsingTask 之前,我想确保构建 Xamarin.Android 项目,但不幸的是,我在我的 Xamarin.Android 项目中收到有关缺少引用的错误,说我缺少引用到 System.Collections,但是当我删除对新 BuildTask.DLL
的引用时错误消失了我以前从未这样做过,所以我可能会陷入困境...如果有人有任何建议,我们将不胜感激。
这是我的 BuildTask class 供参考:
using System;
using Microsoft.Build.Utilities;
using Microsoft.Build.Framework;
using System.Xml;
public class BuildTask : Task
{
private const string AndroidNamespace = "http://schemas.android.com/apk/res/android";
[Required]
public string PackageName { get; set; }
[Required]
public string ApplicationLabel { get; set; }
[Required]
public string ManifestFilename { get; set; }
public string Debuggable { get; set; }
public override bool Execute()
{
var xml = new XmlDocument();
xml.Load(ManifestFilename);
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);
nsmgr.AddNamespace("android", AndroidNamespace);
if (xml.DocumentElement != null)
{
xml.DocumentElement.SetAttribute("package", PackageName);
var appNode = xml.DocumentElement.SelectSingleNode("/manifest/application", nsmgr);
if (appNode != null && appNode.Attributes != null)
{
var labelAttribute = appNode.Attributes["label", AndroidNamespace];
if (labelAttribute != null)
{
labelAttribute.Value = ApplicationLabel;
}
var debuggableAttribute = appNode.Attributes["debuggable", AndroidNamespace];
if (debuggableAttribute != null)
{
debuggableAttribute.Value = Debuggable;
}
xml.Save(ManifestFilename);
return true;
}
}
return false;
}
}
谢谢。
那是因为您将完整的 .NET Framework 引用到 Xamarin.Android 项目。 这个完整的 .NET 框架与 Xamarin.Android 不兼容。 您应该使用以下之一:
创建一个 Android 库项目。
创建便携式 Class 库项目。
创建共享项目。