WebSurfer's Home

トップ > Blog 1   |   Login
Filter by APML

Visual Studio 2019 がフリーズする

by WebSurfer 21. June 2020 13:30

自分が使っている Visual Studio Cummunity 2019 のバージョンを 16.6.0 にアップグレードした後、[ヘルプ(H)]⇒[Microsoft Visual Studio のバージョン情報(A)]でバージョン情報を表示しようとすると、

ヘルプでバージョン情報を表示

以下の画像で示したようにビジー状態となってしまいます。一旦こうなってしまうと Visual Studio の操作が不能になってしまい、タスクマネージャーで Visual Studio を終了する他手がなくなってしまいます。

VS2019 がビジー状態

4 月に MySQL 8.0.19 をインストールしたのですが、その時同時にインストールされた MySQL for Visual Studio v1.2.9 との相性の問題が原因のようで、それを Visual Studio の[拡張機能(X)]⇒[拡張機能の管理()]で表示される「拡張機能の管理」ダイアログで無効にすると、

拡張機能の管理

以下の画像の通りバージョン情報は表示されるようになりました。(MySQL の何をインストールしたかの詳細は、先の記事「MySQL をインストールしました(その 3)」を参照ください)

バージョン情報

調べてみると、Microsoft の Developer Community フォーラム About Microsoft Visual Studio frozen で報告が上がっていて、MySQL for Visual Studio 以外にも Oracle Developer Tools for Visual Studio 2019 Version: 19.3.1.0 で同様な問題が出るそうです。

というわけで、どうしても Oracle の開発ツールを使う必要がある時以外は無効にしておいた方が良いかもしれません。自分が使ってきた限りではバージョン情報の表示以外の不具合は気が付かなかったのですが・・・

Developer Community フォーラムによると "A fix for this issue has been internally implemented and is being prepared for release." とのことですので、そのうち修正されることを期待してます。

Tags: , , ,

DevelopmentTools

ローカル .wsdl ファイルからプロキシ作成

by WebSurfer 11. May 2020 12:06

.NET Framework アプリから Web / WCF サービスに接続して情報を取得する場合、Visual Studio の「サービス参照の追加」を利用してアプリと Web / WCF サービス間のインターフェイスとなるプロキシクラスを生成し、それを利用すると思います。

サービス参照の追加

Microsoft のチュートリアルなどでは、上の画像で[アドレス(A):]に設定するのはサービスの URL(例: http://example.com/service.svc)という記述しか目にしてこなかったので、URL 以外はダメだと思い込んでいましたが、実はローカルの .wsdl ファイルでも OK でしたという話を書きます。

Microsoft のドキュメント「Web サービス プロキシの作成」に ".NET Framework SDK には、Web サービス記述言語ツール (Wsdl.exe) が含まれています。これにより、.NET Framework 開発環境で使用する Web サービス プロキシを生成できます" という記述があります。

その記事のコード例では、やはりサービスの URL を設定していますが、Wsdl.exe のヘルプ(以下の画像参照)を見るとローカル .wsdl ファイルのパスでもよさそうです。

Wsdl.exe のヘルプ

一方、.wsdl ファイルですが、@IT の記事「WSDL:Webサービスのインターフェイス情報」によると十分なインターフェイス情報が含まれているようで、それからプロキシクラスが生成できないわけはなさそうです。

Visual Studio も「サービス参照の追加」ウィザードには Wsdl.exe を使っているはずです。なので、自分が作った Web サービスから .wsdl ファイルを作り、それを自分の PC のローカルフォルダにおいて、そのバスを「サービス参照の追加」ダイアログの[アドレス(A):]に設定して試してみました。

結果、以下の通りプロキシクラスを生成できます。

生成されたプロキシクラス

アプリから生成されたプロキシクラスを使って Web サービスに接続し、期待通りの結果が得られることも確認できました。

実際に URL ではなくローカルの .wsdl ファイルからプロキシクラスを作成しなけれなならないケースがどれぐらいあるのか分かりませんが、Visual Studio でこういうこともできるということで参考になれば幸いです。

(ちなみに http://example.com/service.svc というサービスの URL から .wsdl ファイルをダウンロードするには、その URL に ?wsdl というクエリ文字列を追加して要求をかけます。)

Tags: , ,

DevelopmentTools

JSON 文字列から C# のクラス定義生成

by WebSurfer 10. May 2020 14:24

Newtonsoft.Json などを利用して JSON 文字列を C# のオブジェクトにデシリアライズする際、C# のオブジェクトのクラス定義が必要ですが、Visual Studio を利用してクラス定義を得ることが可能です。

JSON 文字列から C# のクラス定義生成

JSON 文字列をコピー(クリップボードに取得)し、Visual Studio のエディタ上でコードを張り付けたい場所にカーソルを置き、上の画像のように��編集(E)]⇒[形式を選択して貼り付け(S)]⇒[JSON をクラスとして張り付ける(J)]でカーソルの場所に C# のクラス定義が生成されます。

(VS2019 と VS2015 で確認。ちなみに、英語版 Visual Studio では [Edit] ⇒ [Paste Special] ⇒ [Paste JSON As Classes] となります)

具体的には、例えばある Web API の仕様として以下の JSON 文字列のサンプルが公開されていたとします。

{    
  "request":
  {
    "transaction":
    {
      "id" : "10",
      "server" : "10"
    },
    "list" :
    [
      { "group" : "1", "data" : "XXXXX" },
      { "group" : "1", "data" : "XXXXX" }
    ]
  }
}

C# のアプリケーションでこの Web API にアクセスして JSON 文字列を取得して利用する場合は、その JSON 文字列を C# のオブジェクトにデシリアライズすることになります。

デシリアライズに、例えば Newtonsoft.Json の DeserializeObject<T>(String) メソッドを使う場合 T のクラス定義が必要になります。

その場合、上の JSON 文字列をコピー(クリップボードに取得)して、この記事の一番上の画像のように Visual Studio を操作すれば以下の画像の通りカーソルを置いた場所にクラス定義が生成されます。

生成されたクラス定義

DeserializeObject<T>(String) メソッドの T は上の画像でいうと Rootobject になりますので、それを使って Rootobject 型の C# のオブジェクトにデシリアライズできます。

知ってました? 実は自分は最近まで知らなかったです。(汗)

Tags: , ,

DevelopmentTools

About this blog

2010年5月にこのブログを立ち上げました。その後 ブログ2 を追加し、ここは ASP.NET 関係のトピックス、ブログ2はそれ以外のトピックスに分けました。

Calendar

<<  July 2020  >>
MoTuWeThFrSaSu
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

View posts in large calendar