在Xamarin Forms各平台项目中无法引用接口类的问题求助
我来帮你排查这个困扰你的问题——平台项目找不到共享项目里的ITextToSpeech接口,通常是以下几个常见原因导致的,一步步来解决:
确认平台项目已引用共享项目
这是最容易忽略的点:右键你的Android/iOS/UWP项目 → 选择「添加」→「引用」,在弹出的窗口里确保已经勾选了你的Xamarin.Forms共享项目(也就是定义ITextToSpeech的FirstPrismApp项目)。如果没有添加这个引用,平台项目根本看不到共享项目里的任何类和接口。检查命名空间的引用是否正确
在平台项目的实现类代码顶部,必须添加对应的命名空间引用:using FirstPrismApp.Services;也可以直接使用完全限定名来声明接口类型,比如
FirstPrismApp.Services.ITextToSpeech,不过更推荐用using语句简化代码。务必核对命名空间的拼写、大小写,有时候笔误也会导致找不到类型。验证共享项目与平台项目的框架兼容性
如果你的共享项目是.NET Standard库,要确保平台项目的目标框架和它兼容。比如:- 右键共享项目 → 属性 → 查看「目标框架」(比如.NET Standard 2.0)
- 再查看Android/iOS/UWP项目的属性,确认它们的目标框架支持该.NET Standard版本(比如Android项目至少要选Android 8.0以上才能支持.NET Standard 2.0)
清理并重建整个解决方案
有时候是编译缓存搞的鬼。右键你的解决方案 → 选择「清理解决方案」,然后再选「生成解决方案」。如果还是不行,可以手动删除所有项目的bin和obj文件夹,然后重新编译,这招经常能解决各种奇怪的引用问题。再次确认接口的访问修饰符
你贴的代码里接口是public的,这没问题,但如果不小心把public改成了internal,就会导致外部项目无法访问这个接口。再检查一遍共享项目里的代码:namespace FirstPrismApp.Services { public interface ITextToSpeech { void Speak(string text); } }
举个Android平台实现这个接口的示例(确保上面的步骤都完成后):
using Android.Speech.Tts; using FirstPrismApp.Droid.Services; using FirstPrismApp.Services; using Xamarin.Forms; using System.Collections.Generic; [assembly: Dependency(typeof(TextToSpeechImplementation))] namespace FirstPrismApp.Droid.Services { public class TextToSpeechImplementation : Java.Lang.Object, ITextToSpeech, TextToSpeech.IOnInitListener { private TextToSpeech _textToSpeech; private string _speechText; public void Speak(string text) { _speechText = text; _textToSpeech ??= new TextToSpeech(Android.App.Application.Context, this); var speechParams = new Dictionary<string, string>(); _textToSpeech.Speak(_speechText, QueueMode.Flush, speechParams); } public void OnInit(OperationResult status) { if (status == OperationResult.Success) { var speechParams = new Dictionary<string, string>(); _textToSpeech.Speak(_speechText, QueueMode.Flush, speechParams); } } } }
内容的提问来源于stack exchange,提问作者Behzad

