‘.Net Framework’ カテゴリーのアーカイブ

WPFで長時間かかる処理の間にUIのイベントを処理させるには

2010年7月11日 日曜日

WPFでWindows FormのApplication.DoEventsメソッドと同様に長時間かかる処理の間にUIのイベントを処理させるには、下記のように行う。(MSDNより)

[SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public void DoEvents()
{
    DispatcherFrame frame = new DispatcherFrame();
    Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background,
        new DispatcherOperationCallback(ExitFrame), frame);
    Dispatcher.PushFrame(frame);
}

public object ExitFrame(object f)
{
    ((DispatcherFrame)f).Continue = false;

    return null;
}

WCFを使ってXML-RPC通信を行うには

2010年6月10日 木曜日

Xml-Rpc With WCFから「XML-RPC for WCF」をダウンロード。

上記blogのコメントに従ってXmlRpcDataContractSerializationHelperクラスのDeserializeStructメソッドのループ           

while (reader.NodeType != XmlNodeType.EndElement)
 {

の最後に、下記を追加。(ホワイトスペースと改行(XmlNodeType.Text)をスキップするため)

while (reader.NodeType == XmlNodeType.Whitespace || reader.NodeType == XmlNodeType.Text)
 {
            reader.Skip();
 }

また、Desirializeメソッドでswitch (reader.LocalName)の case XmlRpcProtocol.DateTime:の日付の形式が、dateTime.iso8601の形式(下記例参照)でなかったため修正。

<dateTime.iso8601>19980717T14:08:55</dateTime.iso8601>

また、Desirializeメソッドで<value>の内側に型のタグがない場合stringにする処理がなかったため、メソッドの一番最後に

 else if (reader.NodeType == XmlNodeType.Text)
{
        returnValue = reader.ReadString(); 
}

を追加した。このモジュールの使う手順は下記。

  • 参照にMicrosoft.Samples.XmlRpcを追加。
  • 普通のWCFと同じようにServiceContract, OperationContract属性を追加したインターフェースを定義する。ただし、OperationContractは[OperationContract(Action = "metaWeblog.newPost")]のようにActionにXML-RPCのメソッド名を追加する。また、XML-RPCのstruct型の定義はWCF側ではクラスとして定義し、DataContract, DataMember属性を追加する。
  • Web.configのsystem.serviceModelセクションを下記のように定義する。

<system.serviceModel>
   <extensions>
     <behaviorExtensions>
       <add name=”xmlRpcEndpointBehavior”
            type=”Microsoft.Samples.XmlRpc.XmlRpcEndpointBehaviorSection, Microsoft.Samples.XmlRpc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null” />
     </behaviorExtensions>
   </extensions>
   <services>
     <service behaviorConfiguration=”debugBehavior” name=”実装したクラス名”>
       <host>
       </host>
       <endpoint address=”" behaviorConfiguration=”xmlRpcBehavior” binding=”webHttpBinding”
         contract=”定義したインタフェース名” />
     </service>
   </services>
   <behaviors>
     <endpointBehaviors>
       <behavior name=”xmlRpcBehavior”>
         <xmlRpcEndpointBehavior />
       </behavior>
     </endpointBehaviors>
     <serviceBehaviors>
       <behavior name=”debugBehavior”>
         <serviceMetadata httpGetEnabled=”true” />
         <serviceDebug includeExceptionDetailInFaults=”true” />
       </behavior>
     </serviceBehaviors>
   </behaviors>
   <serviceHostingEnvironment multipleSiteBindingsEnabled=”true” />
 </system.serviceModel>

Visual Studio 2010でjQueryのインテリセンスが効かなかったので

2010年5月11日 火曜日

いろいろと調べたところ、プロジェクトのobj\Debug、obj\Releaseの各フォルダにできる、DesignTimeResolveAssemblyReferencesInput.cacheというファイルに、jQuery-1.4.1-vsdoc.jsファイルの参照が含まれてないのが原因のようだった。

ソリューションエクスプローラ上でjQuery-1.4.1-vsdoc.jsファイルを一旦「プロジェクトから除外」し、 再び「プロジェクトに含める」を実行する操作をDebugモードとReleaseモードそれぞれで行ったところ、直った。

ASP.Net MVC 2の主な新機能

2010年4月25日 日曜日
○HTMLヘルパーを使ってフォームのコントロールを出力するときにIDの文字列を渡す必要がなくなった
今までは
<%= Html.TextBox(“ProductName”, model.ProductName) %>
と書いて
<input id=”ProductName” name=”ProductName” type=”text” value=”xxxxxx” />
のように出力していたが、下記のようにIDの文字列を渡す必要がなくなった。
<%= Html.TextBoxFor(model => model.ProductName) %>
○モデルクラスのプロパティにAttributeをつけることによってバリデーションをサーバ、クライアントの双方でできるようになった
System.ComponentModel.DataAnnotations名前空間下にある下記のAttributeが使用可能。
[Required]、[StringLength]、[Range]、[RegularExpression]
以下使用例。
[Required(ErrorMessage = "名前を入力してください。")]
[StringLength(50, ErrorMessage = "50文字以内です。")]
[Range(0, 120, ErrorMessage = "入力できる数字は0から120までです。")]
[ReqularExpression("^[0-9]{3}-?[0-9]{4}$”, ErrorMessage = “”]
クライアントでもチェックできるようにするにはViewに

<script src=”Scripts/MicrosoftAjax.js” type=”text/javascript></script>
<script src=”Scripts/MicrosoftMvcValidation.js” type=”text/javascript></script>

<% Html.EnableClientValidation(); %>

の3行を追加する。

ADO.Net Entity Frameworkのようにツールで自動生成するモデルを使っている場合は、
自動生成時に属性がなくならないように下記のようにする。
まずPartialクラスのファイルにMetadataType属性を追加する。

[[MetadataType(typeof(PersonMetadata))]
public partial class Person
{
}

次にメタデータクラスを追加して、プロパティに対してバリデーションを設定する。

[Bind(Exclude="ID")]
public class PersonMetadata
{
     [Required(ErrorMessage = "名前を入力してください。")]
     public string Name { get; set; }
}

ValidationAttributeクラスを継承したクラスを作ることによって、独自の検証属性を作ることも可能。

○Actionメソッドでデフォルト値を使えるようになった。
{controller}/{action}/{id}
のようなUrlの時に、

public ActionResult View(int id, [DefaultValue(1)]int page) {
  }

のような使い方が可能。

○非同期コントローラのサポート
非同期コントローラを使うことで負荷の高いサイトでサーバがスレッドプールを使い果たしてしまうのを防げる。

参考サイト

http://www.asp.net/learn/whitepapers/what-is-new-in-aspnet-mvc/

http://www.atmarkit.co.jp/fdotnet/scottgublog/20100113aspnetmvc2/aspnetmvc2.html

WPF でテーマを使用するには

2010年3月4日 木曜日

WPF.Themesを使ってWPFでSilverlight ToolkitのようなThemeを使用することができる。現状21種類のテーマが提供されている。

  1. WPF.Themes.dllWPFToolkit.dllを入手しそれぞれのDLLの参照を追加する。
  2. Windowタグに下記太字部分を追加する。(ThemeにShinyRedを使用する場合)

<Window x:Class=”WpfApplication1.Window1″
    xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation
    xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml
            xmlns:themes=”clr-namespace:WPF.Themes;assembly=WPF.Themes”
            themes:ThemeManager.Theme=”ShinyRed”
    Title=”Window1″ Height=”300″ Width=”300″>

C#とIronPython 2.6の連携方法(変数の受け渡し方)

2010年2月20日 土曜日

IronPythonのインストールディレクトリにあるIronPython.dll, Microsoft.Scripting.dll, Microsoft.Scripting.Core.dll, Nicrosoft.Dynamic.dllに参照を通す。

下記のソースコードのような方法でC#のコードからPythonのスクリプトの実行と変数の値のやりとりが可能。

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Scripting.Hosting;
using IronPython.Hosting;

    public class Class1
    {
        public IronPython.Runtime.List Val1;
        public IronPython.Runtime.List Val2;
    }
    class Program
    {
        static void Main(string[] args)
        {
             ScriptEngine engine = Python.CreateEngine();
             ScriptSource source = engine.CreateScriptSourceFromString(
@”print obj1.Val1
result = obj1.Val2″);
             ScriptScope scope = engine.CreateScope();
             var obj1 = new Class1()
             {
                 Val1 = new IronPython.Runtime.List { 1, “abc” },
                 Val2 = new IronPython.Runtime.List { 2, “def”}
             };
             scope.SetVariable(“obj1″, obj1);
             source.Execute(scope);
             object[] result = scope.GetVariable<IronPython.Runtime.List>(“result”).ToArray();
             Console.WriteLine(“{0},{1}”, result[0], result[1]);
        }

    }

Django1.1.1をIronPython2.6にインストールし、importするとエラー

2010年2月20日 土曜日

Django1.1.1をIronPython2.6にインストールし、importすると下記のようなエラーが発生する。

Cannot call lazy() with both str and unicode return types.

http://bitbucket.org/jdhardy/django-ironpython/changeset/b70eeacda60c/

を参考にして、django.utils.

assert not (cls._delegate_str and cls._delegate_unicode),

の行を

 assert (str is unicode) or not (cls._delegate_str and cls._delegate_unicode), 

に変更したらとりあえず回避できた。