スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

画像を特定のサイズ以下に縮小

  • 2013/08/26 03:52
  • Category: C#
.NETのImageList.ImageSizeに設定できる値は1~256ということで
大きい画像を特定のサイズ以下に等倍縮小してサムネイルを作ってみます。



画像が最初から指定サイズ以下の場合はそのままClone()で返し、
大きい場合は指定サイズ以下になるように縮小しています。

CreateThumbnail(image, 256, 256)とすればImageListで扱える画像が出来上がります。

スポンサーサイト

C#で実行ファイルにdllを埋め込む

  • 2013/08/10 15:56
  • Category: C#
環境
Visual Studio 2012 Express for Windows Desktop
.NET4.5

自作ライブラリを実行ファイルに埋め込もうとしたら引っかかったのでメモ。

http://qiita.com/krsak/items/75a257cc0866a7e8e4aa
.NET4や4.5の場合、ここの「ビルド後に実行するコマンドライン」だけでは
"An exception occurred during merging:
Unresolved assembly reference not allowed: System.Core."
とエラーが起きて正常にマージされないようです。

そこで次のオプションを加えたところ正常にマージできました。


/targetplatform:v4,<path to your v4 framework directory>


コマンド全体としては以下のようになります。
(ILMergeはインストール済み、.NET4/4.5のディレクトリは"C:\Windows\Microsoft.NET\Framework\v4.0.30319"にあるものとします)


set fname_new=$(TargetName)_merge$(TargetExt)
"C:\Program Files\Microsoft\ILMerge\ILMerge" /wildcards /out:%fname_new% $(TargetFileName) *.dll /targetplatform:v4,"C:\Windows\Microsoft.NET\Framework\v4.0.30319"


ただ、マージ処理に時間がかかるっぽいのでReleaseビルド時にのみマージするように書き直してみました。


set fname_new=$(TargetName)_merge$(TargetExt)
if $(ConfigurationName) == Release (
"C:\Program Files\Microsoft\ILMerge\ILMerge" /wildcards /out:%fname_new% $(TargetFileName) *.dll /targetplatform:v4,"C:\Windows\Microsoft.NET\Framework\v4.0.30319"
)


参考
http://www.atmarkit.co.jp/fdotnet/dotnettips/426ilmerge/ilmerge.html
http://qiita.com/krsak/items/75a257cc0866a7e8e4aa
http://geekswithblogs.net/michelotti/archive/2010/06/02/ilmerge---unresolved-assembly-reference-not-allowed-system.core.aspx
http://stackoverflow.com/questions/2961357/using-ilmerge-with-net-4-libraries/
http://stackoverflow.com/questions/150053/how-to-run-visual-studio-post-build-events-for-debug-build-only
http://stackoverflow.com/questions/12005318/post-build-set-command-and-variable-error


8/11追記
.pdbファイルを埋め込みたくない場合はオプションに /ndebug を追加します。

C#.NET4.5でwavの同時再生

  • 2013/08/03 04:47
  • Category: C#
環境: VS Express 2012

C#でwavの再生を行う際、System.Media.SoundPlayerやWindowsAPIのPlaySoundでは同時再生ができません。
そこで、Microsoft.DirectX.AudioVideoPlayback.AudioもしくはMicrosoft.DirectX.DirectSoundを使います。(他にも方法があるかも)
Audioの方が簡単なようなので今回はこちらを使います。


まずはMicrosoft.DirectX.dllとMicrosoft.DirectX.AudioVideoPlayback.dllを参照に追加しますが、
ソリューションエクスプローラ - 参照設定 - 参照の追加 - アセンブリでは
一覧に表示されないため、右下の「参照」からdllを直接参照します。
例: C:\Windows\Microsoft.NET\DirectX for Managed Code\1.0.2902.0\Microsoft.DirectX.AudioVideoPlayback.dll


適当なコードを書いて実行。


private void button1_Click(object sender, EventArgs e)
{
string wav1 = @"C:\1.wav";
string wav2 = @"C:\2.wav";
var audio1 = new Microsoft.DirectX.AudioVideoPlayback.Audio(wav1);
var audio2 = new Microsoft.DirectX.AudioVideoPlayback.Audio(wav2);
audio1.Play();
audio2.Play();
}


すると実行時に
「型 'System.IO.FileLoadException' のハンドルされていない例外が System.Windows.Forms.dll で発生しました
追加情報: 混合モード アセンブリはバージョン 'v1.1.4322' のランタイムに対して作成されており、
追加の構成情報がないと 4.0 ランタイムでは読み込めません。」
という例外が発生しますが、app.configに次の行を追加すれば回避できるようです。


<startup useLegacyV2RuntimeActivationPolicy="true" />


これで上記の例外は発生しなくなりますが、今度はnew Audio()時に別の例外が発生します(Debug時のみ)。

「DLL 'C:\Windows\assembly\GAC\Microsoft.DirectX\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.dll' は、
OS ローダー ロック内でマネージ実行を試行しています。DllMain またはイメージ初期化関数内で
マネージ コードを実行しないでください。この動作は、アプリケーションをハングさせる原因になる可能性があります。」

VSと相性がよくないようで・・・
メニューのデバッグ - 例外 - Managed Debugging Assistants - LoaderLockの
「スローされるとき」のチェックを外せば一応無視できます。


これで無事多重再生ができるようになりました。
が、大量のAudioインスタンスをPlay()した後にDispose()しないでいると
アプリ全体が徐々に不安定になってくるので注意。
再生が終わっても自動でStopしてくれないのが原因っぽいですね。

参考
http://ap.atmarkit.co.jp/bbs/core/fdotnet/21583
http://dobon.net/vb/dotnet/programing/playmidifile.html
http://d.hatena.ne.jp/corosuke2s/20110106/1294285562
http://code-life.net/?p=1333
http://stackoverflow.com/questions/5650025/loader-lock-exception-while-playing-audio-using-directx


8/4追記
oggファイルでも再生できました。

Pagination

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。