标签: portable-class-library


MonoTouch:使用Portable Class Libraries创建多平台应用程序

我的场景:尝试将我们公司创建的应用程序的一小部分从本机代码(用于iOS的iOS/Java的ObjC)移植到C-Sharp.该项目将与我们的Web服务进行交互.该项目的目标是确定将整个应用程序移植到Mono的可行性.

要创建URL,我想使用String.Format().我认为将这个'服务层'放在可移植类库(PCL)中是个明智的想法,因为我不希望这些代码在不同平台上发生变化.可悲的是,似乎字符串库不适用于PCL.

所以我的问题如下:

  1. 我认为PCL相对于"普通"库的主要优点是它们不需要针对不同平台进行重新编译.这个假设是否正确?
  2. 这种经历让我觉得目前PCL相当有限.我是否应该坚持使用PCL并解决这些问题,或者现在最好坚持使用"普通"库?---我假设"普通"库有更多功能暴露.

mono xamarin.ios xamarin.android portable-class-library

4
推荐指数
1
解决办法
2043
查看次数

可移植类库和WebBrowserTask与Windows.System.Launcher

我假设答案是否定的,但以防万一......有没有办法在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,你呢?

提前感谢您的任何提示和技巧!

c# launcher portable-class-library windows-store-apps

4
推荐指数
1
解决办法
515
查看次数

为什么我在使用Microsoft.Bcl时不能在Windows Phone 7.1 MvvmCross项目中使用await关键字 - 无法等待'System.Threading.Tasks.Task?

在使用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)

解决方案中有四个项目:

  1. Windows可移植类库(PCL),其中包含一个接口,用于引用BCL提供的"任务"对象.

  2. 一个针对OS 7.1的Windows Phone类库,它实现了上面的接口,并且还使用了BCL中的"任务".

  3. 另一个Windows可移植类库(PCL),提供应用程序的"核心"功能,包括ViewModel.

  4. 试图引用和使用上述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

4
推荐指数
1
解决办法
2204
查看次数

是否有Task.Delay(0)和Task.FromResult(0)的替代方案?

我正在尝试创建一个利用异步/等待功能集的可移植类库(.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

4
推荐指数
1
解决办法
3360
查看次数

如何在跨平台应用程序中共享Xamarin.Mobile相关代码

我正在研究跨平台移动应用程序,因为我了解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

4
推荐指数
1
解决办法
400
查看次数

新的.Net Type/TypeInfo API中IsInstanceOfType或其等价物在哪里?

我已经阅读了Evolving the Reflection API博客文章,并且当我在PCL中包含"旧"API时,我已经转换了大部分代码,但我无法找到IsInstanceOfType或等同于TypeTypeInfo.它是非常常用的,所以我怀疑它是在新的API下完全丢弃所以我打赌功能刚刚被重命名或折叠在一起其他功能,我只是没有看到它.

c# system.reflection base-class-library portable-class-library

4
推荐指数
1
解决办法
1657
查看次数

等待时,Akavache的GetObject <T>挂起.知道这里有什么问题吗?

我有一个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仍会挂起.

c# android portable-class-library xamarin.forms akavache

4
推荐指数
1
解决办法
2483
查看次数

Xamarin PCL C# - 将字符串反序列化为JSONObject/JSONArray

我在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#做到这一点吗?

感谢您的帮助和阅读!

c# json portable-class-library xamarin

4
推荐指数
1
解决办法
3529
查看次数

Xamarin表单:标签文本中的字母间距

您好我正在使用Xamarin表单PCL构建跨平台应用程序.在那个应用程序中,我需要在标签文本中添加字母间距.我需要标签文字字符之间的空格.有没有办法在所有平台上实现这一目标.在ANDROID中可以使用Letterspacing属性,但我需要所有平台的解决方案,如ios,uwp,win8/8.1.

label portable-class-library xamarin.forms

4
推荐指数
1
解决办法
3765
查看次数