スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
【--/--/-- --:--】 | スポンサー広告
presentationfontcache.exe でハンドルされない例外発生!
先日ThinkPad T60pの調子が悪くてしょうがなかったので、XPを再インストールしました。
HDDは時々買い換えていて、そのたびにディスクコピーしていたのですが
隠しパーティションからの再インストールはうまくできず、MSDNのDVDからインストールしました。
その後、VisualStudio2010とOffice2010もインストールしその時に.NetFramework4.0も入ったようでした。

しばらく調子良かったんですが、数日前からだったか、起動時にPresentationFontCache.exeで
例外が発生してデバッグしますかというエラーメッセージが表示されるようになりました。

Googleで検索すると、WindowsのXPSファイルビューア用みたいなことが書かれてました。
http://raptor03.seesaa.net/article/75090719.html

とはいえ、エラーになるとは書かれてません。

サービスを見たら、
Windows Presentation Font Cache 3.0.0.0 が自動起動
Windows Presentation Font Cache 4.0.0.0 が手動起動
になっていて、どちらも停止中だったので、3.0の方のサービスを起動させてみたら
そこで同じエラーが発生したので、原因はここだとわかりました。

というわけで、これから4.0を自動起動、3.0は手動起動に設定してみます。
結果は・・書くかな?

では。
スポンサーサイト
【2010/10/14 06:12】 | .Net | トラックバック(0) | コメント(0)
.Netネタ 複数EXEをまとめてClickOnce化する! Part2
ここに至る経緯は前回の記事の通りですが、
ようするに各機能はexeで作っておいて、メニューだけClickOnceにして
すべてのexeとともにまとめて発行する方法です。

結論から言うと
1.マニフェストに各機能のexeを追加する
2.全体(メニューのプロジェクト)に対してだけ署名・セキュリティー設定、発行設定を行う
と、これだけです。

1のexeを追加する方法は、
メニュープロジェクトの参照で、作成済みの各機能のexeをファイル参照して追加するだけです。
たとえば、C:\project\機能1\bin\Release\機能1.exe をそのまま参照します。
特にどこかにまとめるとかしなくても構いません。
もちろん、まとめておいたほうが管理という意味ではいいと思います。

2は何も言うことがありません。
メニュープロジェクトに署名、セキュリティー設定、発行設定を行うだけです。
これで、参照したファイルなども含めてすべて安全ですよとマニフェストで公約するわけです。

メニュープログラムから見た場合、特に設定しなければ
各exeはメニュープログラムと一緒にクライアント上の同一フォルダにコピーされるため、
Process.Start("パスなしの各機能.exe")
として普通に起動することができます。

各機能のexeから別の機能のexeを実行するのも同様にできます。

ただし・・・何もしないプログラムで試しただけなので
DBアクセスとかファイルアクセスとかがちゃんとできるのかは未確認です。

その辺はまた今度ということで。

テーマ:プログラミング - ジャンル:コンピュータ

【2009/10/02 09:59】 | .Net | トラックバック(0) | コメント(0)
.Netネタ 複数EXEをまとめてClickOnce化する!
仕事で既存のexeファイルをまとめてClickOnceにできないか調べました。
と、いきなり結論から行くとどうかとブログとしてもどうかと思うので
最初から順番に話しますね。

VB.Netを使って、SqlServerからデータを取得し帳票出力するプログラムを作成しようとしていました。
また、複数のクライアントから使うので、実行ファイルはサーバー上の共有フォルダに配置しようと
考えていました。

で、実際にできあがったexeファイルをサーバーの共有フォルダにおいて実行したら・・


データベースに接続できませんでした
型'System.Data.SqlClient.SqlClientPermission,
System.Data, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=ad9bcbdddddc98a'のアクセス許可の
要求に失敗しました。

なんてエラーがでちゃいました。

調べてみると以下の2つが原因のようでした。
・VB.NetアプリケーションはVB6と異なり、厳格なセキュリティーモデルに従うようになった
・クライアントマシンの既定のセキュリティーの設定ではネットワーク上に配置した
 実行ファイルからSqlServerへのアクセスが許可されていない

なので、対策として以下の3つのいずれかでどうかということになりました。
1.プログラムをクライアントマシン内に配置することでセキュリティーの問題を回避する。
2.各クライアントマシンのセキュリティーの設定を個別に変更する。
3.実行ファイルではなくClickOnceアプリケーションにする

でも、クライアントマシンはたくさんあるので1は不可。
2もたくさんのクライアントのセキュリティー設定を変更したくないし、そもそもセキュリティーを甘くしたくもないので不可。
そうなるとおのずと答えは3のClickOnceってことになります。

で、ClickOnceにしようと思ったんですが、すでにたくさんのexeファイルたちが
できちゃってました。

まぁ、1つ1つプロジェクトのプロパティーを開いて、署名して発行して・・
ってやればいいんですが数が多いと面倒ですよね。

そんな状況から、タイトルにある「複数EXEをまとめてClickOnce化」という案が浮上してきたわけです。
でも、1つもClickOnceにしないと最初の状態に戻るわけなので
メニュープログラムだけはClickOnceにして、他はできあがってるexeを使うようにしたい
というわけで、次のような構成を考えました。

・通常のaaa.exe, bbb.exe を ClickOnceプログラム ccc.application から起動する

で、他の開発メンバーが以下のサイトを見つけてくれたのでこれを手がかりにテスト!

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=42365&forum=7
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=38318&forum=7&3
http://www.atmarkit.co.jp/fdotnet/easyvs/easyvs02/easyvs02_02.html

・・・ちょっと休憩

テーマ:プログラミング - ジャンル:コンピュータ

【2009/10/01 20:22】 | .Net | トラックバック(0) | コメント(0)
RenewCertとClickOnceの証明書の更新
以前、ClickOnceを使ったシステムを作ったのだが、
当時VisualStudioで生成した証明書が1年の有効期限が切れてしまい
発行できなくなってしまった。

いろいろ調べていたらMicrosoftのサイトに対応方法が書いてあり、
掲載されているソースコードを使ってRenewCert.exe というツールを作れということだった。

が、実際にやってみたらコンパイルはできるものの証明書が違うと言われて
スマートに更新できない。

さらに調べていたら以下のサイトを発見!

http://ameblo.jp/enhaunse/entry-10067285543.html

このサイトが参考にしたサイトによれば
・.NetFramework3.0なら大丈夫
・.NetFramework2.0でも、VS2008にすれば大丈夫
とあった。

しかし、ここで参考にしているMSDNの記事は無くなっていたため
改めて検索。

.NET Framework 開発者ガイド
開発者以外が配置する ClickOnce アプリケーションの作成
http://msdn.microsoft.com/ja-jp/library/bb384248.aspx

実際にやってみないとわからないですね。
簡単ではないですけど。。。
【2008/10/10 15:41】 | .Net | トラックバック(0) | コメント(0)
.NetFrameworkのバージョンを列挙する方法
簡単だと思ってたんだけど、実は.netframeworkのバージョンを調べるのは
難しいらしい。

というわけで、.NetFrameworkのバージョンを調べる方法です。
出典はこちら。

vbsのソースコードを引用させていただきます。

↓↓↓引用↓↓↓
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Product")

For Each objItem in colItems
If InStr(objItem.Name, "Microsoft .NET Framework") > 0 Then
Wscript.Echo objItem.Version
End If
Next
↑↑↑引用↑↑↑
これをnetver.vbsとでもして保存し、
wscript netver.vbs
とすればバージョンがメッセージボックスで表示されます。
ちなみにWindows 2003の場合は[WMI Windows インストーラ プロバイダ]
というWindowsコンポーネントを追加する必要があるようです。

↓↓↓引用↓↓↓
1. [プログラムの追加と削除] で、[Windows コンポーネントの追加と削除] をクリックします。
2. [Windows コンポーネント ウィザード] で、[管理とモニタ ツール] を選択してから [詳細] をクリックします。
3. [管理とモニタ ツール] ダイアログ ボックスで、[WMI Windows インストーラ プロバイダ] を選択してから [OK] をクリックします。
4. [次へ] をクリックします。
↑↑↑引用↑↑↑

また、以下のサイトではインストール済みCLRのバージョンを列挙するサンプル(C++)が紹介されています。
Enumerating CLR versions

試してないけど、同じ結果が得られるなら上のwsh版の方が手軽で便利かなと。

テーマ:プログラミング - ジャンル:コンピュータ

【2006/08/06 17:00】 | .Net | トラックバック(0) | コメント(0)
DataGridの列幅の自動調整
http://www.dcarroll.com/blog/396.aspxより引用

アンドキュメンテッドなメソッドらしいですが。

ColAutoResize is an undocumented Private member of Datagrid. This is how to call it via Reflection:

Dim gridType As Type = grid.GetType()
Dim mi as MethodInfo = gridType.GetMethod("ColAutoResize", _
BindingFlags.Instance Or BindingFlags.NonPublic)
mi.Invoke(grid, New Object() {0})

これに対して返信されたのが以下。

Hi! I Try use your method but i cant.
This method found.

Dim t As Type = grid.GetType()
Dim mi As MethodInfo = t.GetMethod("ColAutoResize", BindingFlags.Instance Or BindingFlags.NonPublic)

Dim i As Integer
For i = dgdGrid.FirstVisibleColumn To dgdGrid.VisibleColumnCount - 1
m.Invoke(grid, New Object() {i})
Next

まだ試してませんがとりあえずメモ。

テーマ:プログラミング - ジャンル:コンピュータ

【2006/04/26 10:13】 | .Net | トラックバック(0) | コメント(0)
リアルシステムズ      情報工学技術士事務所


情報工学部門の独立技術士が思うこと

ブログ内検索

カテゴリー

プロフィール

佐藤 誉範

Author:佐藤 誉範
リアルシステムズ

平成3年からソフトハウスでシステム構築を行ってきました。
平成15年に技術士(情報工学部門)の資格を取得し、独立してリアルシステムズを創業。

情報システム構築に関することなら
どんなご相談にも親身に対応させていただきます。
一緒により良いシステムを考えましょう!

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

天気予報

リンク

このブログをリンクに追加する

RSSフィード

ブロとも申請フォーム

この人とブロともになる

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