ブログトップ 記事一覧 ログイン 無料ブログ開設

tekkの日記 C#,VB.NET このページをアンテナに追加 RSSフィード Twitter

人気記事 No.1 どんなオブジェクトでもコピーできる汎用のディープコピー処理

2015-12-23

C# のビルドを高速化する

14:10 | C# のビルドを高速化するを含むブックマーク

性能の良いSSDが手に入ったので、高速ビルドにチャレンジしてみました。


CPU:Intel Xeon E3-1280 V2 3.6GHz(8core)

Memory:32GB(DDR3)

HDD:Intel SSD 750(Read 2,200MB/s Write 900MB/s)

ソースコード規模:総ステップ 16万行、実ステップ 7万行


MSBuildオプションは、/m:8 /t:Rebuild


結果は、17.64 Sec

アンチウイルスソフトを止めて再計測、16.04 Sec


CPU性能とSSD性能が、今後劇的に向上するのは考えにくいので、このあたりが限界かもしれませんね。昔のDelphiは、本当に速かったな。

Windows Server 2008 R2 で、エアロを有効にする

11:33 | Windows Server 2008 R2 で、エアロを有効にするを含むブックマーク

サーバーマネージャーから機能の追加で「デスクトップエクスペリエンス」を追加する。

管理ツール−サービスから「Theme」サービスを自動起動に設定する。

再起動する。

2015-12-20

WCF入門-11 App.config以外のファイルからサービス構成を取得する

22:53 | WCF入門-11 App.config以外のファイルからサービス構成を取得するを含むブックマーク

Sample SourceWCFServer.zip 直


クライアント側は、app.configの場合は、clientbaseを使いますが、別のファイル(例えば、other.config)から設定を読み込む場合は使えません。

ConfigurationManager.OpenMappedExeConfigurationを使ってConfigファイルを読み込んで、ConfigurationChannelFactoryを使ってchannelを作成します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
using System.ServiceModel.Configuration;
using System.Configuration;

namespace WCFInterfaces
{
    public class CustomConfigClientBase<Type>
    {
        private ConfigurationChannelFactory<Type> _factory = null;
        private Lazy<Type> _channel = null;

        public string CustomConfigFileName { get; set;}
        public string CustomEndpointName { get; set;}

        private Type CreateChannel()
        {
            return CreateClientChannel<Type>(ref _factory, this.CustomConfigFileName, this.CustomEndpointName);
        }

        private T CreateClientChannel<T>(ref ConfigurationChannelFactory<T> configChannelFactory,
            string configFilePath, string endPointName)
        {
            var fileMap = new ExeConfigurationFileMap();
            fileMap.ExeConfigFilename = configFilePath;
            var config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
            configChannelFactory = new ConfigurationChannelFactory<T>(endPointName, config, null);
            return configChannelFactory.CreateChannel();
        }

        public CustomConfigClientBase()
        {
            _channel = new Lazy<Type>(CreateChannel, true);
        }

        public Type Channel
        {
            get{
                return _channel.Value;
            }
        }

        public void Close()
        {
            _factory.Close();
        }
    }
}

サーバー側は、app.configの場合は、servicehostを使いますが、別のファイルから読み込む場合は、ApplyConfigurationをオーバーライドする手法が使えます。

ApplyConfigurationがコンストラクタで呼び出されてしまうため、別ファイルのファイルパスはクラスのスタティック変数などで渡す必要があります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
using System.ServiceModel.Configuration;
using System.Configuration;

namespace WCFInterfaces
{
    public class CustomConfigServiceHost : ServiceHost
    {

        public static string CustomConfigFileName {get; set;}

        public CustomConfigServiceHost(Type serviceType) : base(serviceType)
        {
        }

        protected override void ApplyConfiguration()
        {
            var filemap = new ExeConfigurationFileMap();
            filemap.ExeConfigFilename = CustomConfigServiceHost.CustomConfigFileName;

            var config = ConfigurationManager.OpenMappedExeConfiguration(filemap, ConfigurationUserLevel.None);
            var serviceModel = ServiceModelSectionGroup.GetSectionGroup(config);

            bool loaded = false;
            foreach (ServiceElement se in serviceModel.Services.Services) {
                if (!loaded)
                    if (se.Name == this.Description.ConfigurationName) {
                        base.LoadConfigurationSection(se);
                        loaded = true;
                    }
            }
            if (!loaded) {
                throw new ArgumentException("Service Element not found in " + CustomConfigServiceHost.CustomConfigFileName);         
            }
            
            base.ApplyConfiguration();

        }

    }
}

参照設定に、System.ServiceModelとSystem.Configurationが必要です。

Lenovo E550で、Fnキーを押さなくてもFunctionキーを有効にする

22:42 | Lenovo E550で、Fnキーを押さなくてもFunctionキーを有効にするを含むブックマーク

Lenovoのサイトからダウンロードできるユーザーガイドに記載されています。

Escキー+Fnキーを押す。

成功するとFnキーのLEDが点灯するみたいです。

2015-05-06

Windows 7 を ルーターにする

00:59 | Windows 7 を ルーターにするを含むブックマーク

Windows 7ルーター化するには以下のレジストリ設定を変更して、ルータ機能を有効にします。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
IPEnableRouter
REG_DWORD
1

キーがない場合は追加します。レジストリ設定後にシステムを再起動してください。ルータ化したあとは、通常のルータと同様に扱えるようになるので、別のPCでルータ化したWindows 7デフォルトゲートウェイに設定すればルーティングしてくれるようになります。

2015-02-23

C#でMethod全体を排他ロックする

23:06 | C#でMethod全体を排他ロックするを含むブックマーク

javaのsynchronized相当の機能、c#では属性を指定します。

using System.Runtime.CompilerServices;

[MethodImpl(MethodImplOptions.Synchronized)]
public void SomeMethod() {
  
  // sync code
  
}

プロパティのget/setにも以下のように指定できます。

public int SyncProperty
{
    [MethodImpl(MethodImplOptions.Synchronized)]
    get { 
        return i; 
    }
    [MethodImpl(MethodImplOptions.Synchronized)]
    set {
        i = value;
    }
}

2015-02-14

imageをbyte配列に変換する

21:21 | imageをbyte配列に変換するを含むブックマーク

        private byte[] ImageToBinary(Image targetImage)
        {
            using (var mem = new MemoryStream())
            {
                mem.Position = 0;
                targetImage.Save(mem, ImageFormat.Bmp);
                byte[] buffer = new byte[mem.Length];
                mem.Position = 0;
                mem.Read(buffer, 0, (int)mem.Length);
                mem.Close();
                return buffer;
            }
        }

Dispatcherによる、UI更新

21:14 | Dispatcherによる、UI更新を含むブックマーク

スレッドによるUI更新は、invokeやpostmessageを使った更新遅延テクニックを使いますが、WPFで標準的に利用されているDispacherクラスを利用したUI更新を使うことができます。むしろ、今後はこの更新テクニックが主流であるといえます。Postmessageは役割を終えたのかもしれません。



まず、UI更新に利用するDispacherクラスですが完全クラス名はSystem.Windows.Threading.Dispatcherで、参照設定はWindowsBaseになります。WPFプロジェクトだとデフォルトで参照設定されていますが、WindowsFormsプロジェクトだと入っていないので、必要であれば追加します。


使い方の例。Dispacherオブジェクトを格納する変数をForm_Loadで格納しておきます。

        private System.Windows.Threading.Dispatcher _dispather = null;

        private void MainForm_Load(object sender, EventArgs e)
        {

            // UIスレッドのディスパッチャー取得
            _dispather = Dispatcher.CurrentDispatcher;

        }

あとは、UIを更新するところで以下のように記述します。

            _dispather.BeginInvoke(new Action(() => {
                this.checkBox1.Checked = false;
            }), null);