アセンブリ(*.dll)の情報に関する覚書(その弐)

(其の弐)そのアセンブリ、32bitですか?64bitですか?
32bitOSしか無い時代には悩む必要もない事なんだけど、最近は64bitOSが主流になりつつある。そうなると、そういう時代ならではの問題が発生する。
1プロセスにおける32ビットと64ビットの混在
GACに登録されているアセンブリを参照する場合は自動で切り替えてくれるけど、直接参照する(GACを経由しない)時、このアセンブリは果たしてどっちなんだろう?と思うことがある。そういう時には、CorFlagsを利用する。これも、仕事ではbatファイルを作って利用している。

set local;
set PATH=%PATH%;C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools;
CorFlags.exe %1
pause

これにアセンブリをドラッグアンドドロップすると、コマンドプロンプト上に情報が表示される。

C:\Users\xxxx>CorFlags.exe "C:\Users\xxxx\log4net.dll"
Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 4.0.30319.18020
Copyright (c) Microsoft Corporation. All rights reserved.
Version : v4.0.30319
CLR Header: 2.5
PE : PE32
CorFlags : 0x9
ILONLY : 1
32BITREQ : 0
32BITPREF : 0
Signed : 1

詳しい見方は、↓に載っている。
How to interpret the corflags flags?
PE32で、32BITREQ=0, 32BITPREF=0なので、Any CPUでビルドされた、MSIL(プラットフォーム非依存のアセンブリ)であるところまでわかる。
CorFlagsは参照だけではなく、変更もできるらしい…。仕事では使わなさそうなので、参照だけで十分かな。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0

アセンブリ(*.dll)の情報に関する覚書

(其の壱)Public Key Tokenを知りたい。
(方法壱)C:\Windows\Assemblyを開く。
 ただし、GACで登録されているアセンブリだけに限られる。
(方法弐)ildasmを使う。
 仕事で使うときは、batファイル化して、DeskTopやランチャーにおいている。

set local;
set PATH=%PATH%;C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools;
ildasm.exe %1

PATHを設定しているけど、これは各自の環境によって変化する。これをildasm.batみたいな感じでデスクトップに作る。
20150314_1
で、例えばlog4netをそこにドラッグアンドドロップすると、↓のような感じになる。
20150314_2
このアセンブリ内にある名前空間やクラス名がリストアップされている。更に上の方にあるMANIFESTをクリックすると、
20150314_3
という感じで、依存するアセンブリのバージョンやPublic Key Token を確認できる。ただ、自身のKeyはどこにもない(HASH化される前の情報しかない)ので、知りたいアセンブリを参照するアセンブリを作り、そいつの中身をildasmで表示する。
20150314_4
この余白を除外してつなげた文字列「669E0DDF0BB1AA2A」が、Public Key Tokenとなる。
Public Key Tokenは、app.configやWeb.configなんかで、外部アセンブリが持つHandlerクラスを設定する時に必要だったりする。そういう時にも使うし、このアセンブリが、実際他のアセンブリをどれだけ参照しているかも確認できる。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0

MSも必死?

Visual lStudio Community
Pro相当のVisual Studioかー。条件があるとはいえ、いつの間にかフリーで使えるんだ。
JavaでもApple系でも、フリーで良いIDE(開発環境)があるし。
MSも案外必死なのかなー。まあ、条件があるから、ユーザー(開発者)を増やすための策なんだろうな。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0

シリアライザ覚書(参)

シリアライザの一つである、Protocol Buffers(以下、ProtoBuf)の調査で、気づいた点、というかトラブルの元になるであろう性質をメモっておく。
○DataMemberのOrderを消すと、正常にシリアライズしない。エラーもなし。
その弐で使ったクラスのDataMemberからOrderを消すと、ProtoBufでは期待通りの結果にはならない。エラーにもならない。
namespace TawamureDays {

/// <summary>
/// シリアライズ対象用クラス
/// </summary>
[DataContract()]
[ProtoBuf.ProtoContract(UseProtoMembersOnly=false)]
public class TwClass1 {

#region コンストラクタ

/// <summary>
/// コンストラクタ
/// </summary>
public TwClass1() {
this.Text = string.Empty;
this.Date = DateTime.Today;
return;
}

#endregion

#region プロパティ

/// <summary>文字列</summary>
[DataMember()]
public string Text { get; set; }

/// <summary>整数値</summary>
[DataMember()]
public int Integer { get; set; }

/// <summary>数値</summary>
[DataMember()]
public decimal Numeric { get; set; }

/// <summary>日付</summary>
[DataMember()]
public DateTime Date { get; set; }

#endregion
}
}
DataContractシリアライザでは、きちんとできる。ProtBufでは、すべて初期値になる。要するにシリアライズできないという事。エラーにならないといのが非常に困る所。NotSupprtでもInvalidIOperationでも良いから例外になってくれれば気づくのに…。
続きを読む
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0

シリアライザ覚書(弐)

シリアライザ覚書(壱)の続き。各シリアライザを使って、シリアライズ用とデシリアライズ用のメソッドを実装した。

○XmlSerializer
using System;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace TawamureDays {

public static class Serializers {

/// <summary>
/// 対象オブジェクトをファイルへシリアライズします。(Xml)
/// </summary>
/// <param name="obj">対象オブジェクト</param>
/// <param name="filePath">ファイルパス</param>
private static void SerializeByXml<T>(T obj, string filePath) {

var fileStream = System.IO.File.Create(filePath);
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));

using (fileStream) {
serializer.Serialize(fileStream, obj);
}

return;
}

/// <summary>
/// 対象ファイルからオブジェクトをデシリアライズします。(Xml)
/// </summary>
/// <param name="filePath">ファイルパス</param>
/// <returns>デシリアライズ済オブジェクト</returns>
private static T DeserializeByXml<T>(string filePath) {

var fileStream = System.IO.File.OpenRead(filePath);
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));

using (fileStream) {
return (T)serializer.Deserialize(fileStream);
}
}
}
}
ファイルチェック無し。try/catch無しの最低限実装。以下も同じ。

○DataContractSerializer
using System;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace TawamureDays {

public static class Serializers {

/// <summary>
/// 対象オブジェクトをファイルへシリアライズします。(DataContract)
/// </summary>
/// <param name="obj">対象オブジェクト</param>
/// <param name="filePath">ファイルパス</param>
private static void SerializeByDataContract<T>(T obj, string filePath) {

var serializer = new DataContractSerializer(typeof(T));
var fileStream = System.IO.File.Create(filePath);

using (fileStream) {
serializer.WriteObject(fileStream, obj);
}

return;
}

/// <summary>
/// 対象ファイルからオブジェクトをデシリアライズします。(DataContract)
/// </summary>
/// <param name="filePath">ファイルパス</param>
/// <returns>オブジェクト</returns>
private static T DeserializeByDataContract<T>(string filePath) {

var serializer = new DataContractSerializer(typeof(T));
var fileStream = System.IO.File.OpenRead(filePath);

using (fileStream) {
return (T)serializer.ReadObject(fileStream);
}
}
}
}

○DataContractJsonSerializer

using System;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace TawamureDays {

public static class Serializers {

/// <summary>
/// 対象オブジェクトをファイルへシリアライズします。(Json)
/// </summary>
/// <param name="obj">対象オブジェクト</param>
/// <param name="filePath">ファイルパス</param>
private static void SerializeByJson<T>(T obj, string filePath) {

var serializer = new DataContractJsonSerializer(typeof(T));
var fileStream = System.IO.File.Create(filePath);

using (fileStream) {
serializer.WriteObject(fileStream, obj);
}

return;
}

/// <summary>
/// 対象ファイルからオブジェクトをデシリアライズします。(Json)
/// </summary>
/// <param name="filePath">ファイルパス</param>
/// <returns>オブジェクト</returns>
private static T DeserializeByJson<T>(string filePath) {

var serializer = new DataContractJsonSerializer(typeof(T));
var fileStream = System.IO.File.OpenRead(filePath);

using (fileStream) {
return (T)serializer.ReadObject(fileStream);
}
}
}
}

○ProtoBuf.Serializer
using System;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace TawamureDays {

public class Serializers {

/// <summary>
/// 対象オブジェクトをファイルへシリアライズします。(ProtoBuf)
/// </summary>
/// <param name="obj">対象オブジェクト</param>
/// <param name="filePath">ファイルパス</param>
private static void SerializeByProtoBuf<T>(T obj, string filePath) {

var fileStream = System.IO.File.Create(filePath);

using (fileStream) {
ProtoBuf.Serializer.Serialize(fileStream, obj);
}

return;
}

/// <summary>
/// 対象ファイルからオブジェクトをデシリアライズします。(ProtoBuf)
/// </summary>
/// <param name="filePath">ファイルパス</param>
/// <returns>オブジェクト</returns>
private static T DeserializeByProtoBuf<T>(string filePath) {

var fileStream = System.IO.File.OpenRead(filePath);

using (fileStream) {
return (T)ProtoBuf.Serializer.Deserialize<T>(fileStream);
}
}
}
}

○ProtoBuf.ServiceModel.XmlProtoSerializer
using System;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace TawamureDays {

public class Serializers {

/// <summary>
/// 対象オブジェクトをファイルへシリアライズします。(ProtoBuf.ServiceModel)
/// </summary>
/// <param name="obj">対象オブジェクト</param>
/// <param name="filePath">ファイルパス</param>
private static void SerializeByProtoBufSrvModel<T>(T obj, string filePath) {

var fileStream = System.IO.File.Create(filePath);
var serializer = new ProtoBuf.ServiceModel.XmlProtoSerializer(
ProtoBuf.Meta.TypeModel.Create(), typeof(T));

using (fileStream) {
serializer.WriteObject(fileStream, obj);
}

return;
}

/// <summary>
/// 対象ファイルからオブジェクトをデシリアライズします。
/// </summary>
/// <param name="filePath">ファイルパス</param>
/// <returns>オブジェクト</returns>
private static T DeserializeByProtoBufSrvModel<T>(string filePath) {

var fileStream = System.IO.File.OpenRead(filePath);
var serializer = new ProtoBuf.ServiceModel.XmlProtoSerializer(
ProtoBuf.Meta.TypeModel.Create(), typeof(T));

using (fileStream) {
return (T)serializer.ReadObject(fileStream);
}
}
}
}
続きを読む
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0

サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m