2014年12月18日木曜日

ファイルまたはアセンブリ 'Microsoft.SqlServer.Management.Sdk.Sfc, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。

下記の4つのモジュールを追加にインストールして対応した。


2012SharedManagementObjects_x86
2012SharedManagementObjects_x64

2012SQLSysClrTypes_x64
2012SQLSysClrTypes_x86




参考
ダウンロードページについて
http://www.experts-exchange.com/Database/MS-SQL-Server/Q_28458757.html

ダウンロードモジュールについて
http://www.advancesharp.com/blog/1113/could-not-load-file-or-assembly-microsoft-sqlserver-management-sdk-sfc


2014年12月10日水曜日

Disposeのテストについて


▼Controllernのコード

protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
Debug.WriteLine("Dispose disposing=" + disposing);
base.Dispose(disposing);
}

▼単体テストのコード

[TestMethod]
public void Dispose()
{
ApiBeginController controller = new ApiBeginController();

controller.Dispose();

System.GC.WaitForPendingFinalizers();

}

⇒これでコードカバレッジが100%となりました。


Assert.AreEqualでプリミティブ型の配列のチェックが出来ない??あれ?

Assert.AreEqual に失敗しました。<System.String[]> が必要ですが、<System.String[]> が指定されました。

▼エラー
Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException はユーザー コードによってハンドルされませんでした。
  HResult=-2146233088
  Message=Assert.AreEqual に失敗しました。<System.String[]> が必要ですが、<System.String[]> が指定されました。
  Source=Microsoft.VisualStudio.QualityTools.UnitTestFramework
  StackTrace:
       場所 Microsoft.VisualStudio.TestTools.UnitTesting.Assert.HandleFail(String assertionName, String message, Object[] parameters)
       場所 Microsoft.VisualStudio.TestTools.UnitTesting.Assert.AreEqual[T](T expected, T actual, String message, Object[] parameters)
       場所 Microsoft.VisualStudio.TestTools.UnitTesting.Assert.AreEqual[T](T expected, T actual)
       場所 WebApplication.Tests.Controllers.ApiBeginControllerTest.GET() 場所 d:\dev\sample\20141119_WebMVC\20141128_WebApplication\WebApplication.Tests\Controllers\ApiBeginControllerTest.cs:行 33
  InnerException:

▼使用しているコード

Web API(ApiControllerのメソッド)

// GET api/ApiBegin
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}

テストクラス

[TestMethod]
public void GET()
{
//List<string> expected = new List<string> { "value1", "value2" };
//var expected = new String[] { "value1","value2"};

IEnumerable<string> expected = new String[] { "value1", "value2" };

ApiBeginController controller = new ApiBeginController();

//string[] ret = controller.Get() as string[];
IEnumerable<string> ret = controller.Get() as IEnumerable<string>;

Assert.AreEqual(expected, ret);

//Assert.AreEqual(expected, new string[] { "value1", "value2" });



//Assert.AreEqual(expected, expected); //成功
//Assert.AreEqual(ret, ret); //成功
}


⇒CollectionAssertがあるのですね。。。。

[TestMethod]
public void GET()
{
var expected = new String[] { "value1","value2"};

ApiBeginController controller = new ApiBeginController();

string[] ret = controller.Get() as string[];

CollectionAssert.AreEqual(expected, ret);

}

エラー 6 アセンブリ 'WebApplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' は、参照されているアセンブリ 'System.Web.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' よりも新しいバージョンを含む 'System.Web.Http, Version=5.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' を使用します d:\dev\sample\20141119_WebMVC\20141128_WebApplication\WebApplication\bin\WebApplication.dll WebApplication.Tests

WebアプリのSystem.Web.Httpが5.2.2.0
単体テストプロジェクトのSystem.Web.Httpが4.0.0.0
で困っている

web.application
D:\dev\sample\20141119_WebMVC\20141128_WebApplication\packages\Microsoft.AspNet.WebApi.Core.5.2.2\lib\net45\System.Web.Http.dll

web.test
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\System.Web.dll

ということで、テストアプリの参照設定にweb.applicationが追加しているdllを追加して対応しました。

これでテストがすんなりと実行できました。

本来は、web.applicationと同じやり方でSyste.Web.Httpのバージョンを上げる必要があるとは思うのですが、どうやったんだろう??


2014年12月9日火曜日

ブラックボックスな処理の解析について

.net frameworkのアプリケーションであれば、逆コンパイルしてロジックをおえますが、ネイティブであれば、プロセスモニタを使用します。




using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{

//存在するレジストリキー
キー検索(@"SOFTWARE\Microsoft\.NETFramework");

//存在しないレジストリキー
キー検索(@"SOFTWARE\Microsoft\.NETFrameworkHogeHoge");

//存在しないファイル
ファイルアクセス(@"o:\readme.txt");

//存在しないファイル
ファイルアクセス(@"o:\hogehoge.txt");
}

private static void ファイルアクセス(string fileName)
{
try
{
Debug.WriteLine(File.ReadAllText(fileName));

}
catch (Exception ex)
{
Debug.WriteLine(ex.ToString());
//throw;
}
}

private void キー検索(string p)
{
// 操作するレジストリ・キーの名前
string rKeyName = p;
// 取得処理を行う対象となるレジストリの値の名前
string rGetValueName = "InstallRoot";

// レジストリの取得
try
{
// レジストリ・キーのパスを指定してレジストリを開く
RegistryKey rKey = Registry.LocalMachine.OpenSubKey(rKeyName);

// レジストリの値を取得
string location = (string)rKey.GetValue(rGetValueName);

// 開いたレジストリ・キーを閉じる
rKey.Close();

// コンソールに取得したレジストリの値を表示
Console.WriteLine(location);
}
catch (NullReferenceException)
{
// レジストリ・キーまたは値が存在しない
Console.WriteLine("レジストリ[" + rKeyName
  + "]の[" + rGetValueName + "]がありません!");
}
}
}
}

mbbservice.exeがレジストリを頻繁にアクセスする

e-mobileを繋げた時に入ったサービスのようです。
サービスを削除しました。


削除方法
C:\ProgramData\MobileBrServ\Uninstall.exe

を実行して対応した。

2014年12月4日木曜日

ASP.NET Identity パスワード制限の変更について


制限がきついのでパスワードのルールを変更しました。
ところで、6桁未満が入力できない。

manager.PasswordValidator = new PasswordValidator
{
//ここは0しても6文字以上を求められるし、1にしても6文字以上が求められる
//TODO:バグでは?
RequiredLength = 1,


RequireNonLetterOrDigit = false,
RequireDigit = false,
RequireLowercase = false,
RequireUppercase = false,
};


調べたらModelが制約を持っていました。
ここを修正して1桁もOKとなりました。

    public class RegisterViewModel
    {
        [Required]
        [EmailAddress]
        [Display(Name = "電子メール")]
        public string Email { get; set; }

        [Required]
        [StringLength(100, ErrorMessage = "{0} の長さは {2} 文字以上である必要があります。", MinimumLength = 6)]
        [DataType(DataType.Password)]
        [Display(Name = "パスワード")]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "パスワードの確認入力")]
        [Compare("Password", ErrorMessage = "パスワードと確認のパスワードが一致しません。")]
        public string ConfirmPassword { get; set; }
    }

    public class ResetPasswordViewModel
    {
        [Required]
        [EmailAddress]
        [Display(Name = "電子メール")]
        public string Email { get; set; }

        [Required]
        [StringLength(100, ErrorMessage = "{0} の長さは {2} 文字以上である必要があります。", MinimumLength = 6)]
        [DataType(DataType.Password)]
        [Display(Name = "パスワード")]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "パスワードの確認入力")]
        [Compare("Password", ErrorMessage = "パスワードと確認のパスワードが一致しません。")]
        public string ConfirmPassword { get; set; }

        public string Code { get; set; }
    }