trapemiyaの日記

hatenablogが新しくなったんで新規一転また2019年1月からちょこちょこ書いてます。C#中心のプログラミングに関するお話です。

Visual Studio 2019 データセットの一覧を表示している画面の動作が異常に遅い

いつの頃からか、データセットの画面の動作が異常に遅くなった。マウスでTableAdapterをドラッグするだけでも時間がかかる。

確かにTableAdapterは約50個ほどあるが、もっと多い数を他のプロジェクトで扱ったこともあり、その時は動作が重くなかったので、これが原因とは考えにくい。

 

色々試してみて原因を見つけた。どうもドキュメントアウトラインが表示されていると極端にパフォーマンスが落ちるようだ。
ドキュメントアウトラインを表示しないようにしたら、何事も無かったかのように軽快な動作になった。
なお、ドキュメントアウトラインを再表示にするには、「表示」→「その他のウインドウ」にドキュメントアウトラインがあるので、そこから再表示すれば良い。

Crystarl Reportsのバージョンアップでハマる・・・

Visual Studio 2019で久しぶりにCrystal Reportsをいじると、何やら動作がおかしい。コンテキストメニューが2、3回ほどは普通に出るが、そのうち出なくなる。で、そのうちにVisual Studioの操作自体も固まったようになる。完全に固まってはいないのだけれど、ものすごくものすごく動作が遅い感じになる。
調べてみると、ここに出ておりました。


New In SP26 Release - read the above info for SP 21 if upgrading from lower version
1.Addressed customer Incidents
2.Windows Server 2019 and Win10 1903
3..NET Framework 4.8
4.Data source updates (Excel/Access 2019, HANA 2.0 SP04, Oracle 19c)
5.Browser updates (Latest Chrome, Firefox ESR 68)
6.Security updates

 SP26で、Win 10 1908と.NET Framework 4.8 に対応したのね。

で、早速以下からダウンロードしてインストール。

SAP Crystal Reports, version for Visual Studio

https://www.sap.com/japan/products/crystal-visual-studio.html

 インストールの最後にランタイムも入れるか?と聞かれるが、開発マシンとして使い、配布したアプリケーションを動作させないのであれば入れる必要はない。

で、インストールが無事に終わり、Crystal Reportsの編集がVisual Studio 2019上でサクサク動くことを確認。めでたし、めでたし。

だがしかし、コンパイルしてアプリを実行し、クリスタルレポートの帳票を表示しようとすると

Could not load assembly version 13.0.3500.0

 と出るありさま。

で、Crystal Reports関係の参照設定を確認すると、13.0.35のまま。なんで?
仕方がないので、これらを削除し、SP26の13.0.40を参照設定した。ソリューション内の他のプロジェクトを確認すると、13.0.40になっていた。

だがしかし、ここでコンパイルが通らない。

結局、他のプロジェクトも一度、13.0.40を削除し、もう一度同じものを参照設定したところ、無事に認識され、コンパイルできるようになった。

クリスタルレポートの帳票もバッチリ表示された。

 

まとめると、SP26を当てた後は、全てのプロジェクトでたとえ13.0.40のバージョンが参照設定されていたとしても、再度、参照設定をし直した方が良さそうである。

正しい手順はこれだけである!

先ほど紹介したページにも以下のように書かれている。

Note the following changes in SP 26:

  1. .Net Framework 3.5.1 is no longer supported, we’d recommend to use .Net Framework 4.5.2.
  2. Assembly version of CR .Net and RAS .Net upgrade from 13.0.3500.0 to 13.0.4000.0, user should load their project in VS to migrate the references.

 user should load their project in VS to migrate the references.

要は参照設定し直してねってこと

 

さて、注意です。実は私はこの過程で大きなミスを一つやらかしております。

ランタイムをインストールしてしまったのです。

開発マシンにmsi版のランタイムを入れてはダメです!

f:id:trapemiya:20200219021041j:plain

開発マシンにMSI版のランタイムは入れはダメ

 

msiのランタイムをインストールすると、

CrystalDecisions.CrystalReports.Engine.DataSourceException: Error in File temp_・・・.rpt

 というエラーが出るので注意ね!

速攻、msi版のランタイムはアンインストールして下さい。

(参考)

CR13 SP26 Visual Studio Error CrystalReports.Engine.DataSourceException

https://answers.sap.com/questions/12928107/cr13-sp26-visual-studio-error-crystalreportsengine.html

 

ただ、アンインストールするとボロボロになって、コンパイルする通らなくなります。

で、最後にDeveloper for Visual Studio を再インストールして下さい。

これで復旧です!

(おまけ)

参照設定は以下の5つぐらいしとけばとりあえず良し

f:id:trapemiya:20200219023746j:plain

Crystal Reportsの参照設定

CrystalDecisions.CrystalReports.Engine

CrystalDecisions.CrystalReports.ReportSource

CrystalDecisions.CrystalReports.Shared

SAPBusinessObjects.WPF.Viewer

SAPBusinessObjects.WPF.ViewerShared

Windowsフォームだと、CrystalDecisions.Windows.Formsも要ったかな・・・?

 

#クリスタルレポート

【Visual Studio 2019】Version 16.4.5に上げたら勝手に「マイコードのみを有効にする」のチェックが外れた

先ほど、Visual Studio 2019をVersion 16.4.5に上げたところ、デバックのオプションであるマイコードのみを有効にする」のチェックが勝手に外れ、以下の問題が再発。

突然、デバッグでアプリが動かなくなるから一瞬焦りました。

 

System.IO.FileNotFoundException: 'ファイルまたはアセンブリ 'System.XmlSerializers, Version=4.0.0.0,・・・・・指定されたファイルが見つかりません。'

https://trapemiya.hatenablog.com/entry/2020/01/29/141555

 

【Visual Studio】IAをPIAに変更してC#からExcelを操作できるようにする。Visual Studio 2008のプロジェクトをVisual Studio 2019へ

IAでExcelを操作しているVisual Studio 2008のプロジェクトをVisual Studio 2019に持ってくる。コンパイルはできるけど、Excelを操作するところで実行時エラーとなる。

ファイルまたはアセンブリ 'Interop.Office, Version=2.1.0.0, Culture=neutral, PublicKeyToken=null'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。":"Interop.Office, Version=2.1.0.0, Culture=neutral, PublicKeyToken=null"} System.IO.FileNotFoundException

f:id:trapemiya:20200217230016j:plain

Interop.Officeが読み込めないエラー

 IAの実態であるInterop.Excel.dllがGACに無いからだろう。
で、GACに以下のコマンドでインストールしようとするが、

gacutil -i c:\work\Interop.Excel.dll

Interop.Excel.dllが厳密名を持っていないため、「厳密な名前のないアセンブリをインストールしようとしました」とメッセージが出てインストールできない。
これはソースファイルでも無ければどうしようもないので、あっさり諦める。

 

で、PIAへ移行する。
まず、参照の追加で、Microsoft Excel 16.0 Object Libraryを追加する。

f:id:trapemiya:20200217230251j:plain

Microsoft Excel 16.0 Object Libraryの追加

追加されると、Microsoft.Office.Interop.Excelが参照設定に増える。
ちなみにInterop.ExcelはIAのもので、もう使わないので削除して良い。

f:id:trapemiya:20200217230534j:plain

Microsoft.Office.Interop.Excelが追加された

 

これがPIAで、名前空間Microsoft.Office.Interop.Excelなので、IAの名前空間であるExcelMicrosoft.Office.Interop.Excelに変更する。例えば、

Excel.Application m_objExcel =  null;

Microsoft.Office.Interop.Excel.Application m_objExcel =  null;

に変更する。

これでコンパイルしてみるが、以下でエラーとなる。

m_objSheet = (Microsoft.Office.Interop.Excel._Worksheet)(m_objSheets.get_Item(1));

エラーメッセージは、

エラー CS0656 コンパイラが必要とするメンバー 'Microsoft.CSharp.RuntimeBinder.Binder.Convert' がありません

 この解決方法は、ググってすぐに解決した。

'Microsoft.CSharp.RuntimeBinder.Binder.Convert' がありません

https://nonbiri-dotnet.blogspot.com/2017/11/microsoftcsharpruntimebinderbinderconve.html

要は、 Microsoft.CSharpを参照に設定すれば良い。 

ありがとう!

 

これで無事にコンパイルも出来て、Excelファイルを出力することができた。

今ならClosedXMLを使って、簡単にExcelファイルを作ったり弄ったりできるようになったので、PIAでの操作と比べて随分楽になったものです。

【Visual Studio 2019】コードエディタのコンテキストメニューに「このアイテムのフォルダーを開く」コマンドの追加

コードエディタで編集している際に、そのソースファイルがあるフォルダを開きたい場合があります。以下の記事で書いたように、

Visual Studio】ソシューションエクスプローラーでファイルを選択し、そのファイルがあるフォルダをエクスプローラーで開く
https://trapemiya.hatenablog.com/entry/2020/02/15/190920

ソリューションエクスプローラーから当該のファイルを選択して、Ctrl + O を押しててもいいのですが、コードエディタのコンテキストメニューに「このアイテムのフォルダーを開く」コマンドを追加する方法を書きます。
いたって簡単です。
ツール → カスタマイズ で、カスタマイズの画面を開きます。
カスタマイズの画面が開いたら、コマンドタブでコンテキストメニューを選び、プレビューファイルを選択し、コマンドの追加をクリックします。
コマンドの追加の画面が開きますから、そこでカテゴリからファイルを選び、その中からこのアイテムのフォルダを開くを選択してOKボタンを押せば完了です。

f:id:trapemiya:20200217135252j:plain
コードエディタのコンテキストメニューのカスタマイズ
以下のようにコードエディタのコンテキストメニューに「このアイテムのフォルダを開く」が追加されました。
f:id:trapemiya:20200217134908j:plain
コードエディタのコンテキストメニュー

【C#】エラー CS7036 Hoge.Fuga(string 引数)' の必要な仮パラメーター '引数' に対応する特定の引数がありません。

以下のクラスを作成して、

public class Fuga
{
    public Fuga(string param1)
    {
        this.param1 = param1;
    }

    public string param1 { get; set; }
}

以下のように利用しようとすると、

var fuga =  new Fuga {param1 = "あああ"};

エラー CS7036 Hoge.Fuga(string param1)' の必要な仮パラメーター 'param1' に対応する特定の引数がありません。

といったエラーが出る。

これは、引数付きのコンストラクタを定義すると、デフォルトコンストラクタ、つまり引数無しのコンストラクタが暗黙的に定義されなくなるからである。
よって、解決策としては、明にデフォルトコンストラクタを定義してあげましょう。

public class Fuga
{
    //デフォルトコンストラクタ
    public Fuga()
    {
    }

    public Fuga(string param1)
    {
        this.param1 = param1;
    }

    public string param1 { get; set; }
}

【Visual Studio】ソシューションエクスプローラーでファイルを選択し、そのファイルがあるフォルダをエクスプローラーで開く

意外に知らない人がいるんじゃないかと思ってTips。

Visual Studioのソシューションエクスプローラーでファイルを選択し、そのファイルがあるフォルダをエクスプローラーで開くショートカットは、デフォルトで

CTRL + O

です。

f:id:trapemiya:20200215190736j:plain

ファイルを開くのショートカットキー

 ソースを直す前に、そのソースファイルをコピーしておきたいときなんかに便利です。

 【追記】

Ctrl+Oは、Visual Studioでファイルが開かれた状態で行って下さいね。じゃないと、%userprofile%\source\reposフォルダが開かれてしまいます。

【追記2 参考】

Visual Studio 2019】コードエディタのコンテキストメニューに「このアイテムのフォルダーを開く」コマンドの追加

https://trapemiya.hatenablog.com/entry/2020/02/17/135409