我在自定义“地图小部件”组件中使用清晰的地图。为了填充地图,我想使用实体框架,它位于单独的 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
我的项目结构是这样的:
仪表板.exe
- App.Config 包含连接字符串
- 参考 SharpMap
- 引用域.dll
- 包含 MapWidget
域.dll
- 包含 DomainModel 和 Services
- 使用实体模型进行持久化
- App.config 包含连接字符串、实体框架配置部分和实体框架连接工厂
所以我的问题是:
- 为什么会这样?
- 我能做些什么来阻止它?(如果没有,有没有比 Program.cs 更好的地方来存放 hacky 代码)
感谢阅读,如果我不清楚,请让我澄清。