カスタムの「マップウィジェット」コンポーネント内でシャープマップを使用しています。マップにデータを入力するには、別のDLL内にあるエンティティフレームワークを使用します。これは、マップを作成してからデータを取得すると正常に機能します。
public void loadMap() {
var map = new MapWidget(); // Create a new widget which internally uses SharpMap
map.AddCountriesLayer(); // Load the map background from .shp file
var data = new IPService.GetPointsForMap(); // Gets IP address from entity framework, inside "domain.dll"
map.AddDots(data); // Add dots
}
ただし、最初にデータを取得してからマップを作成すると、問題が発生します。
public void loadMap() {
var data = new IPService.GetPointsForMap(); // Accessing entity framework before sharpmap
var map = new MapWidget();
map.AddCountriesLayer();
map.AddDots(data);
}
結果は
System.NotSupportedException "The invoked member is not supported in a dynamic assembly."
at System.Reflection.Emit.InternalAssemblyBuilder.GetExportedTypes()
at GeoAPI.GeometryServiceProvider.ReflectInstance()
at GeoAPI.GeometryServiceProvider.get_Instance()
at SharpMap.Data.Providers.ShapeFile.set_SRID(Int32 value) in C:\dev\DLLs\SharpMap Source\Trunk\SharpMap\Data\Providers\ShapeFile.cs:line 859
at SharpMap.Data.Providers.ShapeFile.ParseProjection() in C:\dev\DLLs\SharpMap Source\Trunk\SharpMap\Data\Providers\ShapeFile.cs:line 978
at SharpMap.Data.Providers.ShapeFile..ctor(String filename, Boolean fileBasedIndex) in C:\dev\DLLs\SharpMap Source\Trunk\SharpMap\Data\Providers\ShapeFile.cs:line 302
at Dashboard.Widgets.MapWidget.AddCountriesLayer() in c:\dev\Dashboard\v1\Dashboard\Classes\Widgets\Generic\MapWidget.cs:line 86
ここで一体何が起こっているのですか?なぜエンティティフレームワークを使用すると最初にそれが壊れるのでしょうか?
この問題を修正するために、これをprogram.csに追加して、ウィジェットを最初にロードするように強制しました。
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// Hack to force SharpMap to register before entity framework
var widget = new Widgets.MapWidget();
widget.Update();
Application.Run(new DashboardForm());
}
しかし、私はそれが好きではありません-それはかなり壊れやすいようで、「偶然の一致によるコーディング」は好きではありません。それを修正するために私にできることはありますか?
ノート:
私はこのブログ投稿を見つけました:http://elegantcode.com/2010/01/28/the-entity-framework-and-the-the-invoked-member-is-not-supported-in-a-dynamic-assembly-例外/ ドメインアセンブリをconnectionStringに追加しました
私のプロジェクト構造は次のとおりです。
Dashboard.exe
- App.Configには接続文字列が含まれています
- 参照SharpMap
- Domain.Dllを参照します
- MapWidgetが含まれています
Domain.dll
- DomainModelとサービスが含まれています
- 永続性のためにエンティティモデルを使用します
- App.configには、connectionstring、entity Framework構成セクション、およびEntityFramework接続ファクトリが含まれています
だから私の質問は:
- なぜそれが起こっているのですか?
- それを止めるために私は何ができますか?(そうでない場合は、ハッキーコード用のProgram.csよりも良い場所があります)
読んでくれてありがとう、はっきりしていないかどうかはっきりさせてください。