WebSurfer's Home

トップ > Blog 1   |   ログイン
APMLフィルター

inc ファイルの C# コードにブレークポイント

by WebSurfer 2018年1月22日 19:02
ASP.NET で使用する .inc ファイルの C# コードにブレークポイントを設定するにはどうすればいいかを書きます。(そもそも .inc ファイルに C# のコードを書く必要があるのかという話はちょっと置いときます)

inc ファイルのコードにブレークポイント

元の話は terateil のスレッド ASP.NETのデバッグについてです。

C# のコードを .inc ファイルに含めて、コードビハインドの .aspx.cs ファイルの C# のコードと同様に ASP.NET にコンパイルさせることができます。

ただし、少なくとも自分の環境では、デフォルトではブレークポイントを設定できませんでした。クリックして特定の行にブレークポイントを設定しようとすると <script runat="server"> の行に設定されるように見えますが、デバッグ実行で止まりません。

どうすればよいかと言うと、Visual Studio の設定で[ツール(T)]⇒[オプション(O)...]⇒[テキストエディタ]のファイル拡張子に inc を追加してやります。

テキストエディター、ファイル拡張子の設定

Visual Studio のヘルプによると、この設定で "特定の拡張子を持つすべてのファイルを Visual Studio 統合開発環境 (IDE) で扱うように指定できます" とのことです。文字のハイライトやインテリセンスが働くようになるだけでなく、ブレークポイントの設定も可能になります。(自分の環境では、.inc ファイルをいったん閉じて再度開く必要がありましたが)

知ってました? 実は、自分は teratail のスレッドで聞くまで知らなかったです。もっと正直に言うと、C# のコードを .inc ファイルに含めても、リテラル扱いとなって、生の C# のコードがそのまま html ソースに出力されると思ってました。(汗)

以下に、検証に使ったコードと、若干のコメント・注意点を書いておきます。

.inc ファイル

この例では JavaScript のコードと C# のコードの両方を含めました。JavaScript のコードは、インラインで .aspx ファイルに書き込んだのと同様にリテラルとして取り込まれ、そのまま html ソースに書き出される。一方、C# のコードはコードビハインド扱いとなり、.aspx.cs ファイル の C# のコードと同様にコンパイルされます。

System.Diagnostics.Debugger.Break(); はブレークポイントが設定できないと思ったので代わりに置いたものです。不要となったのでコメントアウトしました。

<script type="text/javascript">
    var msg = "message";
    // alert(msg);
</script>

<script runat="server">
    protected void Selection_Change(Object sender, EventArgs e)
    {
        //System.Diagnostics.Debugger.Break();
        
        DropDownList ddl = (DropDownList)sender;

        Label1.Text = ddl.SelectedValue;
        
        int i;
        for (i = 0; i < 10; i++)
        {
            //System.Diagnostics.Debugger.Break();
        }
        
        Label1.Text += ", i = " + i.ToString();
    }
</script>

.aspx.cs ファイル

コードビハインドとして Visual Studio が自動生成した C# のコードです。自動生成されたコードのそのままで手は加えていません。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _0023_includeFile : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        
    }
}

.aspx ファイル

<!-- #include file ="analytics.inc" --> で上の .inc ファイルを取り込みます。本体には DropDownList と Label を配置。DropDownList の SelectedIndexChanged イベントのハンドラは .inc ファイルの C# のコードに定義しました。

ASP.NET がこのコードをコンパイルする際、.inc ファイルの JavaScript のコードはそのままリテラルとして取り込まれます(結果、html ソースにはその位置にそのまま JavaScript のコードが書き出されます)。.inc ファイルと .aspx.cs ファイルの C# のコードはコンパイルされます。

<%@ Page Language="C#" AutoEventWireup="true" 
    CodeFile="0023-includeFile.aspx.cs" 
    Inherits="_0023_includeFile" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title></title>
  <!-- #include file ="analytics.inc" -->
</head>
<body>
  <form id="form1" runat="server">
  <div>
    <asp:DropDownList id="ColorList"
      AutoPostBack="True"
      OnSelectedIndexChanged="Selection_Change"
      runat="server">
      <asp:ListItem Selected="True" Value="White">
        White
      </asp:ListItem>
      <asp:ListItem Value="Silver">
        Silver
      </asp:ListItem>
      <asp:ListItem Value="DarkGray">
        Dark Gray
      </asp:ListItem>
      <asp:ListItem Value="Khaki">
        Khaki
      </asp:ListItem>
      <asp:ListItem Value="DarkKhaki">
        Dark Khaki
      </asp:ListItem>
    </asp:DropDownList>
    <br />
    <asp:Label ID="Label1" runat="server" />
  </div>
  </form>
</body>
</html>

Tags: ,

ASP.NET

Ajax Control Toolkit デモ

by WebSurfer 2017年12月16日 20:25

Ajax Control Toolkit の最新版(この記事を書いた時点では v17.1.1.0)のデモを自分の開発環境で動くようにする手順を備忘録として書いておきます。

Ajax Control Toolkit デモ

DevExpress のサイト ASP.NET AJAX Control Toolkit Demos にデモは公開されていますが、自分の開発環境に同じものをインストールし、ソースコードを見たりデバッグ実行したいということがあると思います。

そのためには、まず、GitHub のサイト DevExpress/AjaxControlToolkit から AjaxControlToolkit-master.zip をダウンロードします。

ダウンロードしたファイル AjaxControlToolkit-master.zip の中に AjaxControlToolkit.SampleSite というフォルダがあるので、それを丸ごと解凍して適当な場所にコピーします。

v7.x までは、それを Visual Studio で開いて[デバッグ(D)]⇒[デバッグなしで開始(H)]で実行すれば動いたのですが、v17.1.1.0 では AjaxControlToolkit が見つからないというエラーになります。

基本的には NuGet で必要なパッケージをインストールして web.config を一部修正すれば動くようになるのですが、かなり多くのパッケージをインストールしなければならず、エラーメッセージも意味不明なものがあり、動くようになるまで 2 日ほどハマってしまいました。(笑)

NuGet

自分が NuGet からインストールしたパッケージおよびそのバージョンは以下の通りです。

  1. AjaxControlToolkit v17.1.1
  2. Microsoft.AspNet.Web.Optimization v1.1.3
  3. Microsoft.AspNet.Web.Optimization.WebForms v1.1.3
  4. AjaxControlToolkit.StaticResources v17.1.1
  5. WebGrease v1.6.0
  6. AjaxControlToolkit.HtmlEditor.Sanitizer v17.1.1
  7. HtmlAgilityPack v1.6.7
  8. Antlr v3.5.0.2
  9. Newtonsoft.Json v10.0.3
  10. Microsoft.Web.Infrastructure v1.0.0

web.config の修正箇所は以下の通りです。

  1. <trust level="Medium" /> を削除(理由不明ですが Visual Studio 2015 で IIS Express 64-bt で動かした場合はこれがあるとダメ)
  2. siteMap / providers 要素に <remove name="MySqlSiteMapProvider" /> を追加(これは MySQL の Connector/NET をインストールした自分の環境固有の問題)

上に書いた NuGet でのパッケージのインストールが完了するとアプリケーションの bin フォルダは以下のようになるはずです。

bin フォルダ

以下に自分的に注意すべきと思う点を書いておきます。

WebGrease, HtmlAgilityPack など[ソリューションの NuGet パッケージの管理]ではインストール済みと表示されるものがあります。その場合、新しいバージョンがリリースされていたら更新することでインストールできます。

Microsoft.Web.Infrastructure は新しいバージョンがない(1.0.0 しかない)ので[ソリューションの NuGet パッケージの管理]ではインストールできません。その場合は[パッケージマネージャーコンソール(O)]で以下のようにしてインストールできます。

Update-Package -reinstall Microsoft.Web.Infrastructure

HtmlEditorEntender には AjaxControlToolkit.HtmlEditor.Sanitizer が必要です。これなしで起動しようとすると以下のように "値を Null にすることはできません。パラメータ名:Type" という意味不明なエラーになります。これの原因が分からなくてハマりました。(汗)

エラーメッセージ

加えて、HtmlAgilityPack も必要です。もういい加減にカンベンしてって感じだったのですが、一応ここまででとりあえず動くようにはなりました。(笑)

Tags: ,

AJAX

SQL Server の Order By での濁音の扱い

by WebSurfer 2017年12月15日 16:10

SQL Server のデフォルトでの照合順序 Japanese_CI_AS で、Order By 句による濁音の並び順がどうなるかについて書きます。元の話は teratail のスレッド半角の「濁音なし」「濁音あり」カナのソート順についてです。

照合順序 Japanese_CI_AS

照合順序 Japanese_CI_AS の場合の結果は上の画像の通りです。濁音はアクセントとして扱われ、'キ' と 'ギ' および 'キ' と 'ギ' は Order By 句では同じ順序となり、「クロギアイコ」は「クロキマユ」より前に、「クロギアイコ」は「クロキマユ」より前になっているのが分かるでしょうか。

半角カナの 'ギ' は、実際は 2 つの文字 'キ' (U+FF77) と '゙' (U+FF8D) を合わせたものなのですが、にもかかわらず「クロギアイコ」は「クロキマユ」より前になるのが不思議でした。

その理由は、MSDN Blogs の記事「日本語照合順序での 濁音、半濁音 の取り扱いについて」に書いてありますが、日本語照合順序を使用している場合 '半角文字' + '濁音' または '半濁音' が 1 文字として認識されるからだそうです。

つまり、Order By では濁点がないのと同じ扱いになり、照合順序に _WS の指定がないので全角・半角の区別をせず、上の画像の様な結果となるということのようです。

ちなみに、照合順序を Japanese_BIN2 にして Order By 句を適用すると以下の画像の順序になります。

照合順序 Japanese_BIN2

BIN2 というのは "すべての文字をコードポイントによる比較を行います" とのことです。詳しくは、MSDN Blogs の記事「照合順序 – 文字の比較と並び順 (その 1)」を見てください。

--------------------------------------------

以下にオマケで、Linq で OrderBy を使った時どうなるかという話を書いておきます。これも元は teratail の別スレッドでの話です。

単純に words.OrderBy(s => s); としたときは SQL Server で照合順序を Japanese_CI_AS とした時と同じになります。

カスタム Comparer を定義し、それを OrderBy の第 2 引数に使えば何とでもできるはずです。SQL Server の照合順序 Japanese_BIN2 と同じ結果になるようにするには、String.CompareOrdinal メソッド(それぞれの文字列の対応する Char オブジェクトの数値を評価することで、2 つの String を比較)が使えそうです。

以下のコードで検証した限りですが、望む結果が得られました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication3
{
    public class StringCompareOrdinal : IComparer<string>
    {
        public int Compare(string x, string y)
        {
            return string.CompareOrdinal(x, y);
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            string[] words = { "the", "quick", "brown", 
                "fox", "jumps","クロキマユ", "クロギアイコ", 
                "クロギトミオ", "テスト 項目", "クロキマユ", 
                "クロギアイコ", "クロギトミオ" };

            var query = words.OrderBy(s => s);

            foreach (string s in query)
                Console.WriteLine(s);
            Console.WriteLine("-------------------");

            var query2 = words.OrderBy(s => s, 
                               new StringCompareOrdinal());

            foreach (string s in query2)
                Console.WriteLine(s);

            /*
            結果は:
            brown
            fox
            jumps
            quick
            the
            クロギアイコ
            クロギアイコ
            クロギトミオ
            クロギトミオ
            クロキマユ
            クロキマユ
            テスト 項目
            -------------------
            brown
            fox
            jumps
            quick
            the
            クロキマユ
            クロギアイコ
            クロギトミオ
            テスト 項目
            クロキマユ
            クロギアイコ
            クロギトミオ
            */
        }
    }
}

Tags: , ,

SQL Server

About this blog

2010年5月にこのブログを立ち上げました。その後 ブログ2 を追加し、ここは ASP.NET 関係のトピックス、ブログ2はそれ以外のトピックスに分けました。

Calendar

<<  2018年1月  >>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

View posts in large calendar