カスタム .NET DLL との ColdFusion 10 の統合に取り組んでいますが、微調整することはできません。IEnumerable
このプロセス中に、オブジェクトのメソッドの 1 つに渡すデータ型を作成する以外に、必要なすべてのことを行うことができました。統合する必要があるのは次のとおりです。
Set_Events
私が悩んでいる方法です。その列挙型変数の一部であるはずの個々のイベントを作成できますが、適切な変数型として期待されているように見えるものを作成できません。私はこれをやってみました:
<cfset enum = createObject(".net", "System.Collections.Generic.IEnumerable__1") />
これにより、有効な .NET オブジェクトとGetEnumerator()
メソッドが得られます。
そのメソッドを呼び出そうとすると:
<cfdump var="#enum.GetEnumerator()#">
次のエラーが表示されます。
The GetEnumerator method was not found.
私が試した他のこと:
一般的なリストの作成と追加:
<cfset eventList = CreateObject(".net","System.Collections.Generic.List`1", "dotNetCoreProxy.jar") />
<cfset eventList.Add(javacast("bigdecimal", "30.1234" )) />
それは私に次のエラーを与えます:
An exception occurred while instantiating a Java object. The class must not be an interface or an abstract class. If the class has a constructor that accepts an argument, you must call the constructor explicitly using the init(args) method. Error : System.Collections.Generic.List__1
そして、これは私に同じエラーを再び与えます:
<cfset eventList = CreateObject(".net","System.Collections.Generic.List`1", "dotNetCoreProxy.jar") />
<cfset eventList.Add("foo") />
リストを初期化しようとしています
Leigh のこのコードは次のように機能します。
<cfset eventList = CreateObject(".net","System.Collections.Generic.List`1", "dotNetCoreProxy.jar") />
<cfset elemClass = createObject(".net", "System.String", "dotNetCoreProxy.jar") />
<cfset elemType = elemClass.getDotNetClass() />
<cfset eventList.init( elemType ) />
<cfset eventList.Add("foo") />
<cfdump var="#eventList#">
しかし、これはしません:
<cfobject type="dotnet" name="VideoWallEvent" class="Utilities.VideoWall.VideoWallEvent" assembly="#ExpandPath("Utilities.dll")#">
<cfset eventList = CreateObject(".net","System.Collections.Generic.List`1", "dotNetCoreProxy.jar") />
<cfset elemType = VideoWallEvent.getDotNetClass() />
<cfset eventList.init( elemType ) />
<cfdump var="#eventList#">
次のエラーが表示されます。
Unable to find a constructor for class System.Collections.Generic.List__1 that accepts parameters of type ( System.RuntimeType ).
JNBProxyGUI.exe
これは完全に無駄になりました。Utilities.dll ファイルを参照し、GAC から System.Collections アセンブリを追加できますが、[プロジェクト] メニューの [ビルド] オプションは常に無効になっており、これらのアセンブリが追加されると、どのペインにも何も表示されません。
試験方法
次のすべてのコードを 1 つのページで実行しました。
<cfset UtilitiesProxy = ExpandPath("UtilitiesProxy.jar") />
<cfset DotNetCoreProxy = "dotNetCoreProxy.jar" />
<cfset CoStarUtilities = ExpandPath("CoStar.Utilities.dll") />
<h2>Try using base DLLs and DotNetCore</h2>
<cftry>
<cfobject type="dotnet" name="VideoWallEvent" class="CoStar.Utilities.VideoWall.VideoWallEvent" assembly="#CoStarUtilities#">
<cfset eventList = CreateObject(".net","System.Collections.Generic.List`1", DotNetCoreProxy) />
<cfdump var="#eventList.init(VideoWallEvent.getDotNetClass())#"> (error line)
<cfcatch>
<h3><cfoutput>#cfcatch.type#</cfoutput></h3>
<p><cfoutput>#cfcatch.message#: #cfcatch.detail#</cfoutput></p>
</cfcatch>
</cftry>
<h2>Try using the Utilities Proxy for Everything</h2>
<cftry>
<cfobject type="dotnet" name="VideoWallEvent" class="CoStar.Utilities.VideoWall.VideoWallEvent" assembly="#UtilitiesProxy#">
<cfset eventList = CreateObject(".net","System.Collections.Generic.List`1", UtilitiesProxy) /> (error line)
<cfdump var="#eventList.init(VideoWallEvent.getDotNetClass())#">
<cfcatch>
<h3><cfoutput>#cfcatch.type#</cfoutput></h3>
<p><cfoutput>#cfcatch.message#: #cfcatch.detail#</cfoutput></p>
</cfcatch>
</cftry>
<h2>Try using Utilities Proxy for VideoWall, and DotNetCore for List</h2>
<cftry>
<cfobject type="dotnet" name="VideoWallEvent" class="CoStar.Utilities.VideoWall.VideoWallEvent" assembly="#UtilitiesProxy#">
<cfset eventList = CreateObject(".net","System.Collections.Generic.List`1", DotNetCoreProxy) />
<cfdump var="#eventList.init(VideoWallEvent.getDotNetClass())#"> (error line)
<cfcatch>
<h3><cfoutput>#cfcatch.type#</cfoutput></h3>
<p><cfoutput>#cfcatch.message#: #cfcatch.detail#</cfoutput></p>
</cfcatch>
</cftry>
<h2>Try Initing Wall Event</h2>
<cftry>
<cfobject type="dotnet" name="VideoWallEvent" class="CoStar.Utilities.VideoWall.VideoWallEvent" assembly="#CoStarUtilities#">
<cfset VideoWallEvent.Init() />
<cfset eventList = CreateObject(".net","System.Collections.Generic.List`1", DotNetCoreProxy) />
<cfdump var="#eventList.init(VideoWallEvent.getDotNetClass())#"> (error line)
<cfcatch>
<h3><cfoutput>#cfcatch.type#</cfoutput></h3>
<p><cfoutput>#cfcatch.message#: #cfcatch.detail#</cfoutput></p>
</cfcatch>
</cftry>
<h2>Try Initing Wall Event</h2>
<cftry>
<cfobject type="dotnet" name="VideoWallEvent" class="CoStar.Utilities.VideoWall.VideoWallEvent" assembly="#CoStarUtilities#">
<cfset VideoWallEvent.Init() />
<cfset eventList = CreateObject(".net","System.Collections.Generic.List`1", DotNetCoreProxy) />
<cfdump var="#eventList.init(VideoWallEvent)#"> (error line)
<cfcatch>
<h3><cfoutput>#cfcatch.type#</cfoutput></h3>
<p><cfoutput>#cfcatch.message#: #cfcatch.detail#</cfoutput></p>
</cfcatch>
</cftry>
そして、次のエラー出力が表示されます (ヒント、これらのすべてが失敗します)。
09:22:45.045 - Object Exception - in C:/inetpub/LandsofAmerica/scribble/VideoWall/index.cfm : line 9
Unable to find a constructor for class System.Collections.Generic.List__1 that accepts parameters of type ( System.RuntimeType ).
09:22:48.048 - coldfusion.runtime.dotnet.ProxyGenerationException - in C:/inetpub/LandsofAmerica/scribble/VideoWall/index.cfm : line 19
09:22:48.048 - Object Exception - in C:/inetpub/LandsofAmerica/scribble/VideoWall/index.cfm : line 31
Unable to find a constructor for class System.Collections.Generic.List__1 that accepts parameters of type ( System.RuntimeType ).
09:22:48.048 - Object Exception - in C:/inetpub/LandsofAmerica/scribble/VideoWall/index.cfm : line 43
Unable to find a constructor for class System.Collections.Generic.List__1 that accepts parameters of type ( System.RuntimeType ).
09:22:48.048 - Object Exception - in C:/inetpub/LandsofAmerica/scribble/VideoWall/index.cfm : line 55
Unable to find a constructor for class System.Collections.Generic.List__1 that accepts parameters of type ( CoStar.Utilities.VideoWall.VideoWallEvent ).
必要なすべてのアイテムを含むプロキシを生成しました (と思います)。
結論
だから今私は立ち往生しています。これを機能させるために必要なすべてのオブジェクトをインスタンス化して埋めることはできますが、すべてのオブジェクトをまとめて機能させることはできません。Set_Events メソッドを満たすために必要な ENum オブジェクトを作成しようとすると、何が欠けていますか?