6月 262014
 

VisualStudioの「テストの設定」>「配置」>「ディレクトリの追加」でディレクトリを追加しても、テスト時に配置されるのはディレクトリ自体ではなく、ディレクトリの中身という。。

ディレクトリ自体をコピーしたい場合、outputDirectory属性を指定すれば解決できる。

[xml mark=”5″]


これらはローカル テスト実行用の既定のテスト設定です。



[/xml]

「テストの設定」からは操作できない属性だが、他のファイルやディレクトリを追加しても追記したoutputDirectoryは削除されない模様(VS2013 Update2)。

参考:方法: テスト用のファイルを配置する

6月 262014
 
  • 「NuGet パッケージの復元の有効化」を有効にしてる
  • プライベートリポジトリなどデフォルト以外のリポジトリを利用している

この時、PackageSourceを追加しないと復元に失敗する。
VisualStudioのオプションで追加している場合は成功するが、未設定環境では当然ながら失敗するため、設定をソースと一緒に配信したくなる。

追加できる場所で、容易にソースと一緒に配信できるのは以下のどちらか。

  • .nuget\NuGet.Config
    参照:NuGet Config Settings
  • .nuget\NuGet.targets
    [xml title=”NuGet.targets”]





    [/xml]

  • ConfigではKeyの指定があるが、targetsにはない
  • Configは、%APPDATA%\NuGet\NuGet.Config等、他の同時に読み込まれるNuGet.Configの影響も受けてしまう
    • disabledPackageSourcesで当該キーのソースが指定されていると、無効化されてしまうため、注意が必要となる
    • VisualStudio のオプションでチェックボックスをオフにするとdisabledPackageSourcesに含まれてしまう
  • Reference の解説をさらっと見た限りではConfigの書き方しか書いてない
  • NuGetパッケージマネージャーをバージョンアップした時の影響は不明…
6月 132014
 

WPFにてアクティブなウィンドウが無い状態で引数のownerを指定せずにMessageBox.Show()した場合、メッセージボックスは非モーダルな状態で表示される。
通信等をトリガーにして通知を行う場合などで発生するケース。

参考: MessageBox.cs

モーダルな状態で表示するには、Window.Activate()でウィンドウをアクティブにしてしまうか、MessageBox.Show()の引数でownerとなるWindowを指定すれば良い。

5月 232014
 

参考:ClickOnceアプリケーションをブラウザに読み込んだ HTML 上のスクリプトから起動する際のIEの設定について – Visual Studio サポート チーム blog – Site Home – MSDN Blogs

  • 「ファイルのダウンロード時に自動的にダイアログを表示」が有効でなければならない
  • 「インターネット」、「信頼済みサイト」ゾーンでは既定で無効
  • レベル「中低」が既定値である「ローカルイントラネット」ゾーンは既定で有効
  • IE6~8はインターネットオプションから変更可能
  • IE9以降はレジストリの編集が必要

-例:信頼済みサイトの [ファイルのダウンロード時に自動的にダイアログを表示] のレジストリ情報
————————————————————————————-
レジストリキー : HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\2
値の名前:2200
値の種類:REG_DWORD
値のデータ 00000003(無効) – 既定値
00000000(有効)

11月 222013
 

参考:IISマネージャーからアプリケーションインポートしたら、アプリケーションプールのエラーが出た – minato128のブログ

まさにこれ。

  • msdeployはデプロイ先のアプリケーションプールの.NETバージョンとデプロイ対象アプリのバージョンが一致しているかチェックする
  • IISに4.5をインストールしていたとしても、設定できるのはv4.0
  • VS2010のtargetは4.5に対応していないのか、この状況ではエラーを吐いてデプロイできない

使用しようとしているアプリケーション プールでは、’managedRuntimeVersion’ プロパティが ‘v4.0’ に設定されています。このアプリケーションには ‘v4.5’ が必要です。

  • /t:Packageでデプロイパッケージを作る際のmsbuildオプションに/p:VisualStudioVersion=11.0 (2013は12.0なのかな?)をつければVS2012のtargetを使用するようになるらしく、エラーを吐かずに正常にデプロイ出来るようになる
11月 222013
 

ODACの11g、12cにはOracle.ManagedDataAccessというのが追加されており、ネイティブコードが無くなったのでサーバー環境へのデプロイ時にODP.NETやOracleClientのインストールが不要になる!ということで、やり方を調べてみたメモ。

参考:oracle – Deploying and Configuring ODP.NET to work without installation with Entity Framework – Stack Overflow

これのBのパターンでうまく行った。

  • WCFサービスのホストプロジェクトなどDB接続が必要になるプロジェクトの参照にEntityFramewrokとOracle.ManagedDataAccessを追加し、ローカルコピーをTrueに
  • Web.config/App.configを以下のように設定
[xml]




















[/xml]

  • 適当にデプロイ

Oracle.ManagedDataAccessDTC.dll が必要な場合

  • TransactionScope を使う場合など、Oracle.ManagedDataAccessDTC.dll が必要な時がある
    • 無いと実行時にFileNotFoundExceptionで死ぬ
  • Oracle.ManagedDataAccess.dllと同様に、実行パスかGACに入ってればOK
  • Microsoft Visual C++ 2010 SP1 再頒布可能パッケージ を必要とする点に注意 (SP1じゃなくても大丈夫だとは思うが…)
    • これも同様に、インストールされていないと実行時にFileNotFoundExceptionで死ぬ
  • Oracle.ManagedDataAccessDTC.dll も Microsoft Visual C++ 2010 SP1 再頒布可能パッケージ も32bit版と64bit版があるので、実行環境に合わせたものを使おう
10月 312013
 

DbContextでの話。

普通はDbContextから取得したデータを更新すれば良い。
[csharp]
using (var context = new Entities())
{
var hoge= context.Hoge.Find(“id的な”);
hoge.Fuga = “New!”;
context.SaveChanges();
}
[/csharp]

これはDbContextに変更追跡機能があるため可能な事。
DbContextのライフサイクル外から受け取ったEntityオブジェクトなんかはただのPOCOであり、どう変更されたかなんてDbContextは知らない。
DataSetなんかは、DataTable自体が変更追跡機能持っててシリアライズもできたのだけど…

自己追跡エンティティ(STE)なんかもあるけど、Not Recommendedとされているし、EF6やVS2013ではもう使えない。
EF4から導入されたばかりなのに短い寿命でしたね…

んで、WCFなんかで外部から受け取ったデータは当然変更追跡の対象外なため、Attachとかしないとダメなことは想像付く。
でもAttachしただけではUnchangedな状態なので、変更してくれない。
ではどうすれば良いかというと、どうやらModified状態に変更してしまえば勝手に更新してくれるようだ。
[csharp]
public void Update(Hoge hoge){
using (var context = new Entities())
{
context.Hoge.Attach(hoge);
context.Entry(hoge).State = EntityState.Modified;
context.SaveChanges();
}
}
[/csharp]
削除はAttachしてからRemoveすればOK。
[csharp]
public void Remove(Hoge hoge){
using (var context = new Entities())
{
context.Hoge.Attach(hoge);
context.Hoge.Remove(hoge);
context.SaveChanges();
}
}
[/csharp]

ちなみにナビゲーションプロパティでIncludeされてる関連オブジェクトがある場合で、外部キーの値を変更したのに、関連オブジェクトは変更前のままとかいう場合、Attachすると死ぬ。
[csharp]
//どっかで読み込んだ
context.Hoge
.AsNoTracking()
.Include(x => x.Piyo)
;
[/csharp]
[csharp]
//どっかで外部参照のキー値を更新した
hoge.PiyoId = “new id”; //※hoge.Piyoは変更前のまま
[/csharp]
[csharp]
//そのままAttachすると死ぬ
context.Hoge.Attach(hoge);
[/csharp]
この場合、どうやらナビゲーションプロパティをnullにしてしまえばAttachできる。
関連オブジェクトを再取得してきてちゃんと値を合わせてやってもうまくいくんじゃないかな?(試してない
[csharp]
hoge.Piyo = null;
//これなら大丈夫。取得時にIncludeしてないのと同じ状態になる。
context.Hoge.Attach(hoge);
[/csharp]