MacユーザがDynamicsプラグインを作成する[プラグイン登録編]

「Macユーザだってプラグイン開発がしたい!」第3弾。
Visual Studioのインストールプラグインの作成ができたので、今回はプラグイン登録編です。

スポンサーリンク

結論から言うと…

Mac OSから、Dynamicsのプラグインを登録させることはできませんでした

Dynamicsのプラグインを登録するためには、Dynamics 365 SDKのPluginRegistrationと言うツールを使用して登録していくのが公式な方法なんですが、Mac OSはexeが実行できないため、このツールを起動させることができませんでした。

試したこと

結局できていませんが、Macでプラグイン登録がしたかったので、僕が試したことをいくつか。

Visual Studio for Mac上から何とか実行させる

PluginRegistrationはVisual Studio for MacからNuGetパッケージとして取得することができます。

パッケージの追加から。
Visual Studio for MacからNuGetパッケージを追加

「Microsoft.CrmSdk.XrmTooling.PluginRegistrationTool」を選択。
(作成者がMicrosoftなので多分公式のもの)
Microsoft.CrmSdk.XrmTooling.PluginRegistrationToolを選択

パッケージを追加すると、フォルダが作成され、そこにPluginRegistration.exeも含まれています。
PluginRegistration.exeがダウンロードされる

このexeを何とかして実行したいのですが、直接叩いたり、Visual Studio for Mac上から実行させたり色々試しましたが結局動かず。
一度、Visual Studioから離れることにしました。

Wineを使用してexeファイル実行

Mac OSからexeを動かすためには、Wineを使用することで、exeファイルが実行できることがあるらしいです。
簡単に説明すると、WineはWindows APIをMas OS上に実装してexeファイルを実行させることができると言う仕組みなのです。

と言うことで、早速Wineというものを入れてみる。
でも、Wineを入れるためには、というアプリを入れないといけないらしいので、まずはそれから動かす。

ここからXQuatzをインストール。

次に本命のWineを入れる。ここからWineをインストール
バージョンは安定版のものをダウンロードしました。

インストールは特に難しい手順もなく、無事完了。

あとはパッケージ追加でNuGetダウンロードされたパッケージにPluginRegistration.exeが含まれているので、これを実行。
パッケージ内のPluginRegistration.exeを実行

実行するときは、「このアプリケーションを開く」から「Wine Stable」を指定して実行。
exeファイルをWineを使用してアプリケーション実行

返事がない(Dockには出てるのに…)
Wineのアイコンが表示される

消えた!! (゚ロ゚)

Wineのアイコンが消えた

終了( ´•̥̥̥ω•̥̥̥` )

虚しい結果に終わりました。。。

というわけで、Mac OSからプラグイン登録は断念。
VirtualBox使って、Windowsインストールすれば多分できると思うんですが、手間と容量がかかるので、こちらは試していません。

結局Windowsから登録

以上のことを試してみて、Mac OSではうまくいかなかったので、諦めてWindowOSから登録。

ここでも、ちょっとハマったのでメモ。

Visual Studio for Macで作成したDLLをロードしようとした時に、こんなエラーが発生しました。
DLLファイルロード時のエラー

エラーの詳細にはこんなメッセージが。

Unhandled Exception: System.IO.FileLoadException: ファイルまたはアセンブリ ‘file:///{ファイルの場所}\AccountCheck.dll’、またはその依存関係の 1 つが読み込めませんでした。操作はサポートされません。 (HRESULT からの例外:0x80131515)
場所 System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
場所 System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
場所 System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
場所 System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark& stackMark)
場所 System.Reflection.Assembly.LoadFrom(String assemblyFile)
場所 Microsoft.Crm.Tools.Libraries.CrmAssemblyReader.LoadAssembly(String path)
場所 Microsoft.Crm.Tools.Libraries.CrmAssemblyReader.RetrievePluginsFromAssembly(String path)
場所 Microsoft.Crm.Tools.Libraries.CrmAssemblyReader.RetrievePluginsFromAssembly(String path)
場所 Microsoft.Crm.Tools.Libraries.RegistrationHelper.RetrievePluginsFromAssembly(String pathToAssembly, String appPath)
場所 Microsoft.Crm.Tools.AssemblyRegistration.PluginRegistrationViewModel.BtnLoadAssemblyClicked()
Inner Exception: System.NotSupportedException: ネットワーク上の場所からアセンブリを読み込もうとしました。これにより、以前のバージョンの .NET Framework で、アセンブリがサンドボックス化された可能性があります。このリリースの .NET Framework では、CAS ポリシーが既定で有効になっていないため、この読み込みは危険な場合があります。この読み込みがアセンブリのサンドボックス化を目的としない場合は、loadFromRemoteSources スイッチを有効にしてください。詳細については、http://go.microsoft.com/fwlink/?LinkId=155569 を参照してください。

アセンブリの署名の仕方を間違えたか、依存ファイルが足りていないかと思いきや、紐解いていくとDLLに問題があった模様。
MacからWindowsにDLLを移す際に、Zipで固めてからネットワーク経由でファイルを移していたんですが、そこに罠があったみたいです。

ネットワークからDLLをダウンロードすると、ファイルアクセスが自動的にかかるみたいですね。
ウイルスとかに感染しないようにWindowsの親切設計でそうなっているとのこと。

ということで解決策。
ファイルのプロパティからセキュリティの所にチェックを入れればOKです。
ファイルのプロパティからDLLのセキュリティファイルアクセス解除

今回は自分で作ったDLLなので出所が分かっているんですが、良い子のみんなはむやみやたらにEXEやDLLをブロック解除しないようにね!

ファイルのプロパティを変更して、再度PluginRegistration.exeを動かすと、Visual Studio for Macで作成したプラグインの登録ができました。
Macで作成したDLLをプラグイン登録

このようにステップの登録までできました!
Macで作成したプラグインでステップの登録

実際に動作検証してみましたが、取引先企業番号未入力時にちゃんとエラーも吐いてくれました。
プラグインもきっちり動作しているようです。
プラグイン動作もOK

まとめ

以上から、Mac環境ではプラグインの作成までは一応できるということが分かりました。
ただし、プラグインの登録は、PluginRegistrationの実行ができなかったので、ここだけWindowsでやらなきゃいけないことが分かりました。

プラグインの作り方や、登録のしかた、デバッグの方法などもっと上手いやり方があるかもしれないので、知見のある方がいましたら教えてください。

ただ、今回ご紹介した方法は、Microsoftから公式にMac環境でのプラグイン作成が出ていない(今後も出るのか!?)ので、自分なりの理解で進めた非公式なやり方になっています。
インストール編でのおことわりにも書きましたが、Mac環境でのプラグイン開発および動作検証は自己責任でお願いします。
動かなくなる可能性もありえるので、本番環境には極力Windowsから作成したDLLを入れるようにしましょう。

Dynamics
スポンサーリンク

コメント