カテゴリー「C#」の8件の記事

2011年7月 1日 (金)

プラットフォーム毎に参照先を変える

開発機を Windows7 に変更したら 32bit 版DLLで問題が発生

1.とある プログラム を 32bit でコンパイル(32bit版DLL)
2.1で作成されたDLLを参照設定で読み込む
3.読み込んだプロジェクトを 64bit でコンパイル
4.実行すると「間違ったフォーマットのプログラムを読み込もうとしました。」とか怒られる

※ 32bit 版のアプリから 64bit版 DLLを参照した場合も同様

全て同じプロジェクトなら構成を変えれば良いのですが、DLLでしか提供されない場合、
コンパイルの度に参照の追加と削除をしなければならないのか?

そんなの面倒なので、プラットフォームを変更するたけで参照先を変えたい・・・
調べてみたらドンピシャな回答がありました

その回答は・・・「*.csproj」を直接編集するw

参照の設定は、「*.csproj」ファイル の <ItemGroup> <Reference> タグで管理されているため、それを書き換えてやろうというのだ。

  • DLLの出力先が x86、x64 などプラットフォーム毎に異なる場合、 $(Platform) を使用することで動的に切り替えることができる
  • DLLの出力先が Debug、Release 毎に異なる場合、$(Configuration) を使用することで動的に切り替えることができる

<ItemGroup>
     <Reference Include="CtrlCmdCLI, Culture=neutral">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\$(Platform)\$(Configuration)\CtrlCmdCLI.dll</HintPath>
       <Private>False</Private>
    </Reference>

実践してみると、思った通りの動きになり今の所問題なく動作しています。

2011年5月25日 (水)

XAML を使用したグラフ作成

仕事でツールを使わずにグラフを描いてほしい
・・・という依頼があったが、その話が無くなったためメモ程度に保存します

環境:Windows7、Microsoft Visual Studio 2010

■ グリッド線を xaml 側で作成

*.xaml 側の記述

<!-- グラフ1 -->
<Grid Name="gridarea" Background="#FFFFFF" Margin="0" Width="500" Height="180">
 <Canvas Name="canvasarea" Margin="0" Width="Auto" Height="Auto">

 <!-- キャンバスとグリッド線の作成 -->
  <Canvas.Background>
   <DrawingBrush Viewport="0,0,30,10" ViewportUnits="Absolute" TileMode="Tile">
    <DrawingBrush.Drawing>
     <DrawingGroup>
      <DrawingGroup.Children>
       <GeometryDrawing>
        <GeometryDrawing.Geometry>
         <LineGeometry StartPoint="0,0" EndPoint="0,1"/>
          </GeometryDrawing.Geometry>
           <GeometryDrawing.Pen>
            <Pen Thickness="0.02" Brush="Black"/>
           </GeometryDrawing.Pen>
          </GeometryDrawing>
          <GeometryDrawing>
           <GeometryDrawing.Geometry>
            <LineGeometry StartPoint="0,0" EndPoint="1,0"/>
           </GeometryDrawing.Geometry>
           <GeometryDrawing.Pen>
            <Pen Thickness="0.02" Brush="Black"/>
           </GeometryDrawing.Pen>
          </GeometryDrawing>
         </DrawingGroup.Children>
        </DrawingGroup>
       </DrawingBrush.Drawing>
      </DrawingBrush>
     </Canvas.Background>
 </Canvas>

 <!-- 中央の青い範囲の作成 -->
  <Rectangle Name="safearea" Canvas.Left="0" Canvas.Top="45" Width="500" Height="90" >
   <Rectangle.Fill>
    <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
     <GradientStop Color="#aaaaccff" Offset="0.0" />
     <GradientStop Color="#00ffffff" Offset="0.5" />
     <GradientStop Color="#aaaaccff" Offset="1.0" />
    </LinearGradientBrush>
   </Rectangle.Fill>
  </Rectangle>
</Grid>

*.cs 側の記述

   :
   (省略)
   :

 #region プライベート変数

 /// <summary>表の幅 </summary>
 private int CanvasWidth = 500;
 /// <summary>表の高さ </summary>
 private int CanvasHeight = 180;
 /// <summary>中央の青い部分 </summary>
 private int SafeHeight = 100;

 /// <summary>折れ線の色</summary>
 private Brush LineStroke = System.Windows.Media.Brushes.MidnightBlue;
 /// <summary>折れ線の幅</summary>
 private int LineThickness = 2;

 /// <summary>頂点の色</summary>
 private Brush dotColor = System.Windows.Media.Brushes.MidnightBlue;
 /// <summary>頂点のサイズ</summary>
 private int dotSize = 6;

 /// <summary>点座標値の設定</summary>
 private Point[] AreaPoints;
 #endregion

 #region 頂点のスタイル
 private enum Shape
 {
  /// <summary>四角</summary>
  Rectangle,
  /// <summary>円</summary>
  Circle,
  /// <summary>三角</summary>
  Triangle,
 }
 #endregion

   :
    (省略)
   :

 #region 表の初期化
 /// <summary>
 /// 初期化処理
 /// </summary>
 private void Init()
 {
  // 表のサイズを設定する
  gridarea.Width = CanvasWidth;
  gridarea.Height = CanvasHeight;
  canvasarea.Width = CanvasWidth;
  canvasarea.Height = CanvasHeight;

  // 中央の青い範囲の追加
  safearea.Width = CanvasWidth;
  safearea.Height = SafeHeight;
  Canvas.SetTop(safearea, (CanvasHeight - SafeHeight) / 2);

  // テストの値を設定
  int[] values = { 100,120,70,50,80 };

  // 各頂点の設定
  Point[] points = new Point[values.Length];
  int splitval = CanvasWidth / (values.Length - 1) ;
  for (int i = 0; i < values.Length; i++)
  {
    points[i] = new Point(i * splitval, values[i]);
  }
  AreaPoints = points;

  // 線の生成
  CreateLineForWindow(canvasarea, AreaPoints ,Shape.Rectangle);

 }
 #endregion

 #region 折れ線の生成
 /// <summary>
 /// ウィンドウ用の線を生成する
 /// </summary>
 /// <param name="canvas">描画キャンバス</param>
 /// <param name="points">データ</param>
 /// <param name="shape">頂点の形状</param>
 private void CreateLineForWindow(Canvas canvas, Point[] points,Shape shape)
 {
  for (int i = 0; i+1 < points.Length ;i++)
  {
   // 線の設定 --------------------
   Line line = new Line();
   // 線のアウトライン
   line.Stroke = LineStroke;
   // 線のアウトラインの太さ
   line.StrokeThickness = LineThickness;
   line.X1 = points[i].X;
   line.Y1 = points[i].Y;
   line.X2 = points[i+1].X;
   line.Y2 = points[i+1].Y;
   canvas.Children.Add(line);

   // 始点の設定 --------------------
   CreateDotShape(canvas, points[i], shape);
  }
  // 終点の設定 --------------------
  CreateDotShape(canvas, points[points.Length - 1], shape);
 }
 #endregion

 #region 頂点の生成
 /// <summary>
 /// 頂点を生成する
 /// </summary>
 /// <param name="canvas">描画キャンバス</param>
 /// <param name="points">頂点のポイント</param>
 /// <param name="shape">頂点の形状</param>
 private void CreateDotShape(Canvas canvas, Point points ,Shape shape)
 {
  switch (shape)
  {
   // 頂点(円)の生成
   case Shape.Circle:
    Ellipse ellipseDot = new Ellipse();
    // アウトライン
    ellipseDot.Stroke = dotColor;
    // 塗りつぶし
    ellipseDot.Fill = dotColor;
    // 太さ
    ellipseDot.StrokeThickness = 1;
    ellipseDot.Width = dotSize;
    ellipseDot.Height = dotSize;
    Canvas.SetLeft(ellipseDot, points.X - dotSize / 2);
    Canvas.SetTop(ellipseDot, points.Y - dotSize / 2);
    canvas.Children.Add(ellipseDot);
    break;

   // 頂点(四角)の生成
   case Shape.Rectangle:
    Rectangle rectangleDot = new Rectangle();
    // アウトライン
    rectangleDot.Stroke = dotColor;
    // 塗りつぶし
    rectangleDot.Fill = dotColor;
    // 太さ
    rectangleDot.StrokeThickness = 1;
    rectangleDot.Width = dotSize;
    rectangleDot.Height = dotSize;
    Canvas.SetLeft(rectangleDot, points.X - dotSize / 2);
    Canvas.SetTop(rectangleDot, points.Y - dotSize / 2);
    canvas.Children.Add(rectangleDot);
    break;

   // 頂点(三角)の生成
   case Shape.Triangle:
    Polygon triangleDot = new Polygon();
    // 各点の設定
    PointCollection myPointCollection = new PointCollection();
    myPointCollection.Add(new Point(0, -dotSize / 2));
    myPointCollection.Add(new Point(-dotSize / 2, +dotSize / 2));
    myPointCollection.Add(new Point(+dotSize / 2, +dotSize / 2));
    triangleDot.Points = myPointCollection;
    // アウトライン
    triangleDot.Stroke = dotColor;
    // 塗りつぶし
    triangleDot.Fill = dotColor;
    // 太さ
    triangleDot.StrokeThickness = 1;
    Canvas.SetLeft(triangleDot, points.X);
    Canvas.SetTop(triangleDot, points.Y);
    canvas.Children.Add(triangleDot);
    break;
  }
 }
 #endregion

表示されるグラフ

1

2010年12月21日 (火)

InvokeRequired と Invoke の使用例

C# における InvokeRequired と Invoke の使用例

※別スレッドからアイテム操作を行う場合に使用する

// delegate の定義(引数・戻り値をAddListViewと合わせる)
private delegate void AddListViewDelegate(ListView view, ListViewItem item);

/// <summary>
/// リストビューにアイテムを追加
/// </summary>
/// <param name="view">追加対象のリストビュー</param>
/// <param name="item">追加内容。</param>
private void AddListView(ListView view, ListViewItem item)
{
  // Invoke メソッドを使用するべきかどうかを判断(別スレッドの場合)
  if (InvokeRequired)
  {
    //AddListViewDelegateの作成(メソッドを指定)
    AddListViewDelegate dlg = new AddListViewDelegate(AddListView);

    // Invokeメソッドを使用する
    // dlg : delegateを指定
    // object[] : delegate で使用する引数を指定する。
    this.Invoke(dlg, new object[] { view, item });
    return;
  }
  // 通常の処理(同一スレッドの場合)
  view.Items.Add(item);
}

C# ComboBox の DataSource 書き換え時の即時反映

ソース上でコンボボックスの DataSource を単に書き換えても、
フォーム上には反映されない。
反映させる場合は一旦 null を設定し、その後で再設定する必要がある。

■ フォーム読み込み時

// データソース用のデータを Setting.settings より取得&設定(型:System.Collections.Specialized.StringCollection)
cmbBoxYyyyy.DataSource = Properties.Settings.Default.XxxxxList

■ボタンなどを押した時の処理

// ComboBox の入力値を保存
String SaveText = cmbBoxYyyyy.Text ;

// DataSource 用のデータを取得
StringCollection SaveItem = Properties.Settings.Default.xxxxxList;

// ComboBox 入力値を追加
SaveItem.Add(SaveText);

// Setting.settings のデータを保存
Properties.Settings.Default.xxxxxList = SaveItem;
Properties.Settings.Default.Save();

// 保存したデータで再設定する(下記のNull設定が無いと表示が更新されない)
cmbBoxYyyyy.DataSource = null;
cmbBoxYyyyy.DataSource = Properties.Settings.Default.xxxxxList;

// 入力値を再設定
cmbBoxYyyyy.Text = SaveText;

2010年12月17日 (金)

DataGridViewのサイズをフォームのサイズに合わせて変更する

Anchor プロパティーを変更すると、
画面のサイズに合わせてコントロールのサイズ位置などが変更される。

画面サイズが決まっていない場合、
画面の最大化、サイズ変更等を行って確認する必要がある

■ 参考サイト

http://www.atmarkit.co.jp/fdotnet/csharptips/002anchor/002anchor.html

■CSVファイル→dataGridview( = gridview ) にデータを設定する

DataGridViewにデータを追加(CSV→DataGrid( = gridview ))

   // 追加アイテム用に配列を宣言
   String[] item = new String[] { };

   // ファイルを読み込む
   using (StreamReader sr = new StreamReader(
     files, Encoding.GetEncoding("Shift_JIS")))
   {
     while (sr.EndOfStream == false)
     {
       // 1行読込
       text = sr.ReadLine();

       // CSV分解
       item = text.Split(',');

       //データグリッド追加、行アイテム宣言
       DataGridViewRow gridline = new DataGridViewRow();

       // もともとのGridView( = gridview )のセル定義を利用
       gridline.CreateCells(gridview);

       // 行アイテムにデータを設定
       gridline.SetValues(item);

       // 行アイテムをDataGridViewに追加する
       gridview.Rows.Add(gridline);

                }
                sr.Close();
            }

2010年12月 1日 (水)

PartCover インストールメモ

Nunitのカバレッジ取得で使用

1.インストール
  http://sourceforge.net/projects/partcover/
  →ファイルをダウンロードする(partcover.setup-2.3.0.35109.msi)
  →ダウンロードファイルを実行してインストール

2.PartCoverをVisual Studioに組み込む
  →メニューバーの[ツール]-[外部ツール]を選択する。
  →以下の情報を登録する。
  1)タイトル→PartCover
  2)コマンド→C:\Program Files\Gubka Bob\PartCover .NET 2.3\PartCover.exe
  3)引数    →--target $(TargetPath) --output $(TargetDir)\PartCoverResult.xml --include *
  4)[出力ウィンドウを使用]にチェックをつける。

Executable File  :NUnitのインストールディレクトリのnunit.exeを選択
Working Direcotry:コードカバレッジを測定したいフォルダ(例:dllの出力フォルダ)
Working Arguments:コードカバレッジを測定するdll(例:***.dll)

2010年11月30日 (火)

C# テストツール Nunit インストール

C#の開発で使用するテストツール「Nunit」のインストールメモ

1.Nunitのダウンロード
  http://nunit.com/
  →「Download」を選択
  →「NUnit-2.5.8.10295.msi」を選択
  →任意の場所に保存

2.Nunitのインストール
  ダウンロードファイルを実行する
  →インストーラが起動するので「Next」で進める
  →ライセンスに同意して「Next」
  →SetUpTypeを選択して「Next」
  →SetUpTypeが選択完了した場合は「Install」
  →インストール後は「Finish」

3.Nunitの設定
  スタートプログラムよりNUnitを起動
  →メニューの [Tools] - [Settings...]を選択
  →「IDE Support」を選択
  →「VisualStudio」を選択
  →「Enable Visual Studio Support」をチェック
  →「OK」を選択

4.動作確認
  下記サンプルプログラムを利用
  C:\Program Files\NUnit 2.5.8\samples
  ※インストール場所によって異なります

  →さんぷるプログラムを任意の場所にコピーする
  →「vb-samples.sln」を起動
  →変換ウィザードが起動したら「次へ」を選択
  →コピーなのでバックアップを作成せずに「次へ」を選択
  →「完了」を選択
 
  →起動後にエラーが発生している場合は nunit の参照を変更する
    →プロジェクト「vb-failures」を右クリック
      →プロパティーを選択
      →「参照」を選択
      →「nunit.framework」を削除
      →「追加」を選択して「.NET」タブの「nunit.framework」を選択
    →プロジェクト「vb-money」の参照も同様に変更する
    →プロジェクト「vb-syntax」の参照も同様に変更する
   
  スタートプログラムよりNUnitを起動
  →メニューの[File] - [Open Project...]を選択
  →「vb-samples.sln」選択
  →[Run] ボタンを選択
  →緑・赤の実行結果が表示される