是否可以使用Monodevelop构建可移植类库?
我的场景:尝试将我们公司创建的应用程序的一小部分从本机代码(用于iOS的iOS/Java的ObjC)移植到C-Sharp.该项目将与我们的Web服务进行交互.该项目的目标是确定将整个应用程序移植到Mono的可行性.
要创建URL,我想使用String.Format().我认为将这个'服务层'放在可移植类库(PCL)中是个明智的想法,因为我不希望这些代码在不同平台上发生变化.可悲的是,似乎字符串库不适用于PCL.
所以我的问题如下:
我假设答案是否定的,但以防万一......有没有办法在PCL中执行特定于平台的代码?
我的具体例子非常适合PCL.使用profile104(WP7/Windows Store/Net40)完全支持绝大多数代码.唯一特定于平台的是启动深层链接的能力:
my-custom-protocol://some/url
Run Code Online (Sandbox Code Playgroud)
非共享代码是:
On WP7, it would be:
WebBrowserTask web = new WebBrowserTask();
web.Uri = BuildUrl();
web.Show();
On WP8 and Windows Store it would be:
Windows.System.Launcher.LaunchUriAsync(BuildUrl());
On Net40, I guess you would host a web-browser control.
Run Code Online (Sandbox Code Playgroud)
因此,公共库提供自定义"任务"对象,这些对象提供"BuildUrl()"的实现.问题是,在支持的设备上,您希望启动"my-custom-protocol:// some/url",但在任何其他设备上,您要转到网络后备http://mysite.com/some/网址.这一切都包含在:
new CustomTask(data).Show()
Run Code Online (Sandbox Code Playgroud)
选项1(当前实现):不要使用PCL,并在CustomTaskBase类中使用#ifdefs来包含平台细节.但是,我真的不希望维护平台特定的项目文件,并将cs文件添加为链接:-(
选项2:将发射器放在特定于平台的组件中,将所有其他代码放在PCL中.同样,我不喜欢这样,因为它看起来很重,并没有减少我们的项目数量.它还意味着客户端需要引用两个程序集,而不是一个程序集,这对于一些自定义任务来说似乎有点过分.
选项3:将抽象的IPlatformSpecificLauncher注入Launcher的构造函数,然后该构造函数成为URLBuilder.这会将启动代码移动到客户端,这将是复制粘贴(尽管很小).然而,它确实使API复杂化并使其可读性降低.
new CustomTask(new WP8Launcher(), data).Show()
Run Code Online (Sandbox Code Playgroud)选项4:更改API,以便CustomTask只返回要启动的URL(并再次在客户端中启动启动代码).但是,如何在不支持自定义协议的设备上实现Web回退?你不能说如果(平台== WP7)在PCL,你呢?
提前感谢您的任何提示和技巧!
在使用Microsoft.Bcl"Microsoft BCL Portability Pack"时,我无法在MvvmCross Windows Phone 7.1项目中使用await关键字.
我已经在GitHub上发布了我在下面描述的示例项目的代码,并且此行发生了await错误.
当我尝试构建包含FirstViewModel的第三个"核心"Windows可移植类库(PCL)时,我得到以下错误:
Type System.Threading.Tasks.Task<string> not awaitable under VS red squiggles, and
Cannot await 'System.Threading.Tasks.Task<string>' when building.
Run Code Online (Sandbox Code Playgroud)
解决方案中有四个项目:
Windows可移植类库(PCL),其中包含一个接口,用于引用BCL提供的"任务"对象.
一个针对OS 7.1的Windows Phone类库,它实现了上面的接口,并且还使用了BCL中的"任务".
另一个Windows可移植类库(PCL),提供应用程序的"核心"功能,包括ViewModel.
试图引用和使用上述DLL的Windows Phone 7.1 /"7.5"应用程序.
前两个项目包含接口和接口的实现编译没有任何错误.但第三个"核心"PCL无法使用上面显示的错误构建.
更多细节如果你想要他们:
我尝试了这个App.config"修复",如"已知的BCL问题"中所述:http: //blogs.msdn.com/b/bclteam/p/asynctargetingpackkb.aspx.但是当我添加时没有解决错误App.config只是"核心"项目,当我尝试将相同的App.config添加到每个项目时.有可能我没有在元素中使用正确的版本或我只是错误地做了App.config的东西.
解决方案中设置为以PCL为目标的每个项目在Visual Studio中都设置为"Profile104".
那些DLL位于:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.0\Profile\Profile104\
Run Code Online (Sandbox Code Playgroud)
此PCL配置文件显示为在Visual Studio项目属性中定位这些平台:适用于Windows应用商店应用的.NET,.NET 4.5,Silverlight 4+和Windows 7.5+
解决方案中的每个项目也都通过NuGet引用了Microsoft.Bcl"Microsoft BCL Portability Pack".
所有四个项目都使用MvvmCross(Mvx).
此示例中的所有项目都没有尝试定位与Xamarin Droid/iOS堆栈相关的任何内容.它是所有Windows,并且仍然在await关键字上失败.
带有接口的PCL和Windows Phone类库都使用Mvx CrossCore NuGet包,并设置为"Mvx插件".
"Core"PCL使用完整的MvvmCross NuGet包,并包含发生等待错误的FirstViewModel.
Windows Phone App项目也引用了完整的MvvmCross,并将Windows Phone特定的Mvx文件引入其中.
如上所述,请参阅GitHub上失败的示例代码.
c# base-class-library windows-phone portable-class-library mvvmcross
我正在尝试创建一个利用异步/等待功能集的可移植类库(.NET 4.5/Silverlight 5/Win Phone 8/WinRT).我发现我需要包含Microsoft.Bcl.AsyncNuGet包才能使这个功能正常工作,所以我做到了这一点.显然由于我的目标,我无法访问Task.Delay(0)或Task.FromResult(0).我想知道下一个最好的选择是什么?
目前,我正在使用:( new Task(() => { })基本上,一个不执行任何操作的任务.)
我不确定这是否与前面提到的模式中的任何一个最佳等效.
更新:显然我是盲目的,并没有TaskEx在我的intellisense菜单中看到.我打开这个问题所以人们知道它就在那里,只是因为我的intellisense自动完成而容易错过TaskExtensions.
.net c# base-class-library async-await portable-class-library
我正在研究跨平台移动应用程序,因为我了解Xamarin.Mobile的开发是为了增加跨平台应用程序中的代码共享.虽然我不能把它放入PCL.我得到的是每个API方面的平台特定实现(联系人,地理位置等).
同时文件链接也不会起作用,因为Geolocator(仅作为示例)构造函数包含特定于平台的参数(在MonoDroid的情况下为Android.Context).
我应该如何在Monodroid,Monotouch和WP上分享Xamarin.Mobile相关逻辑?我错过了一些Xamarin概念吗?
谢谢,Alexey Strakh
xamarin.ios xamarin.android portable-class-library xamarin xamarin.mobile
我已经阅读了Evolving the Reflection API博客文章,并且当我在PCL中包含"旧"API时,我已经转换了大部分代码,但我无法找到IsInstanceOfType或等同于Type或TypeInfo.它是非常常用的,所以我怀疑它是在新的API下完全丢弃所以我打赌功能刚刚被重命名或折叠在一起其他功能,我只是没有看到它.
c# system.reflection base-class-library portable-class-library
我有一个Xamarin.Forms应用程序,在我的App类中使用此代码(是的,这只是一个演示问题的示例):
public App()
{
BlobCache.ApplicationName = "MyApp";
BlobCache.EnsureInitialized();
// The root page of your application
MainPage = GetMainPage();
}
public object BlockingGetExternalUser()
{
return GetExternalUser().Result;
}
private async Task<object> GetExternalUser()
{
try
{
return await BlobCache.LocalMachine.GetObject<object>("user");
}
catch (KeyNotFoundException)
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
密钥"用户"不存在,所以我希望得到一个KeyNotFoundException.但是我从来没有看到过抛出这个异常.相反,它只是"挂起",永远不会从await GetObject调用返回.
我在Android 5.0手机上运行此功能.
任何想法如何解决这一问题?我做了一些根本错误的事吗?
更新:旁注:不是立即尝试GetObject,而是可以尝试检查密钥是否实际存在于缓存中,然后才从缓存中检索它.但是,如果我没有弄错的话,除了调用GetObject并捕获异常之外没有其他方法可以进行检查,就像上面的示例一样.对于一个人只想知道项目是否存在的情况,这似乎并不理想.也许在Akavache中使用"存在()"方法会很好吗?或许我错过了什么?
Update2:更改示例以在构造函数中不使用async方法.只是为了证明这不是问题.
Update3:从构造函数中删除调用.当我从代码中的任何地方调用BlockingGetExternalUser时,await仍会挂起.
我在Android上做了很多工作,但今天我必须和Xamarin合作.我正在创建一个PCL类,我正在尝试从字符串(HttpWebResponse转换为字符串)创建一个JSON对象,以便从Android包装器进行调用.
经过一些研究,我无法找到真正回答我问题的任何东西.
最终我希望能够像这样打电话:
string value = jsonObject.get("key").getAsString();
Run Code Online (Sandbox Code Playgroud)
我从http响应中获取一个字符串,然后我想将其转换为JSON对象.创建JSON对象时,我想提取一个类似示例的值.但是,我是用PCL制作的,所以可以在PCL中用Xamarin/C#做到这一点吗?
感谢您的帮助和阅读!
您好我正在使用Xamarin表单PCL构建跨平台应用程序.在那个应用程序中,我需要在标签文本中添加字母间距.我需要标签文字字符之间的空格.有没有办法在所有平台上实现这一目标.在ANDROID中可以使用Letterspacing属性,但我需要所有平台的解决方案,如ios,uwp,win8/8.1.
c# ×6
.net ×2
xamarin ×2
xamarin.ios ×2
akavache ×1
android ×1
async-await ×1
json ×1
label ×1
launcher ×1
mono ×1
monodevelop ×1
mvvmcross ×1