Bob*_*sky 5 c# silverlight porting system.drawing
我们有很多C#2.0代码,它们严重依赖于System.Drawing命名空间.还有一些WinGDI依赖项(通过互操作).
您如何建议解决制作功能相当的Silverlight版本代码的问题?我们希望尽可能多地重用代码,因为我们希望继续开发代码的两个版本.
也许你可以推荐一些文章/书籍?
更新:代码是一个非可视组件.不是申请.没有第三方依赖项.
首先,您应该接受原始代码的某些功能不会出现在 Silverlight 版本中。互操作、读写文件——这些事情要么因为安全原因而被禁止,要么只是不受支持。
第二件事要记住的是,您的代码将受到条件编译的污染(如果您想继续支持从同一代码库构建 .NET 版本)。
第三件事是 - 您将必须编写一些新代码(而不是删除的代码)。例如,您可能需要创建接受的新方法WriteableBitmap而不是接受的方法System.Drawing.Bitmap,以便为 Silverlight 版本的用户提供类似的功能集。
好的,让我们看一下您可能需要执行哪些操作才能创建 Silverlight 版本的 .NET 库。
以下是有关如何修复常见构建错误的一些提示。
using namespace-name不需要的指令。使用条件编译排除不支持的命名空间,如下所示:#if !Silverlight
使用系统绘图;
#万一
如果您使用的是 Silverlight 中缺少的枚举(例如System.Drawing.Imaging.ImageFormat),则引入等效的自定义枚举(例如MyImageFormat)并更改内部代码以仅使用自定义枚举。如果需要,将使用自定义枚举(或等效的 Silverlight 枚举)的重载方法添加到公共接口。
对结构进行同样的操作(例如System.Drawing.PointF)或更改代码以使用更简单的类型(例如用两个floats 而不是PointF结构)
通过条件编译排除使用不受支持的结构的公共和私有代码。考虑重写内部代码,使其仅使用 .NET 和 Silverlight 支持的语言结构。
创建一个包装类来访问 Silverlight 版本中的嵌入式资源,因为不会有任何现成的包装器为您提供byte[]或string用于二进制和文本资源。
创建一个像这样的属性
公共静态编码默认编码
{
得到
{
#如果银光
返回编码.UTF8;
#别的
返回编码。默认;
#万一
}
}
并使用此属性而不是Encoding.Default在您的代码中。
迟早您将能够创建代码的 Silverlight 版本。这个版本的功能可能会较少,但是,嘿,Silverlight 并不是一个成熟的 .NET。有些功能在 Silverlight 中甚至是不必要的。对于某些原始功能,您稍后可能会添加等效的功能。
如果您使用nunit对 .NET 版本进行单元测试,那么您可能需要查看nunit-silverlight(也请查看此页面)来测试 Silverlight 版本。不过,也有一些注意事项。
TestCaseSourcenunit-silverlight 不支持该属性。如果您需要在测试中读取或写入本地文件,那么您应该在测试应用程序中使用 Silverlight 4。在 Silverlight 3 中无法执行此操作。您还应该将测试应用程序设置为浏览器外应用程序并为其授予更高的信任权限(在浏览器外设置中选中“需要提升的信任”)
您需要一个包装器(是的,另一个包装器)来读取和写入本地文件,因为 Silverlight 测试将只能使用和生成字节缓冲区和流。
以下是一些可能对包装器有用的代码片段:
获取当前文件夹的路径:
Uri uri = new Uri(System.Windows.Application.Current.Host.Source, relativeFileName);
var currentPath = uri.OriginalString;
Run Code Online (Sandbox Code Playgroud)
请注意,您需要file://从开头删除currentPath
读取本地文件(通过 COM 自动化)
private static byte[] readBinaryFile(string fileName)
{
const int adTypeBinary = 1;
using (dynamic adoCom = System.Runtime.InteropServices.Automation.AutomationFactory.CreateObject(@"ADODB.Stream"))
{
adoCom.Type = adTypeBinary;
adoCom.Open();
adoCom.LoadFromFile(fileName);
return adoCom.Read();
}
}
Run Code Online (Sandbox Code Playgroud)
写入本地文件(也通过 COM 自动化)
private static void writeBinaryFile(string fileName, byte[] binaryArray)
{
const int adTypeBinary = 1;
const int adSaveCreateOverWrite = 2;
using (dynamic adoCom = System.Runtime.InteropServices.Automation.AutomationFactory.CreateObject(@"ADODB.Stream"))
{
adoCom.Type = adTypeBinary;
adoCom.Open();
adoCom.Write(binaryArray);
adoCom.SaveToFile(fileName, adSaveCreateOverWrite);
}
}
Run Code Online (Sandbox Code Playgroud)
您可能还想检查Silverlight COM Toolkit。不过我不使用它。
祝你好运!