我在自定义“地图小部件”组件中使用了清晰的地图。要填充地图,我想使用实体框架,该实体框架位于单独的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-exception/
我将域程序集添加到connectionString

我的项目结构是这样的:

仪表板


App.Config包含连接字符串
引用SharpMap
引用Domain.Dll
包含MapWidget


Domain.dll


包含DomainModel和服务
使用实体模型进行持久化
App.config包含连接字符串,实体框架配置部分和实体框架连接工厂




所以我的问题是:


为什么会这样呢?
我该怎么做才能阻止它? (如果没有,那么对于hacky代码,有没有比Program.cs更好的地方了)


感谢您的阅读,请让我澄清一下我是否不清楚。

最佳答案

我有一个非常相似的问题,但是我没有使用实体框架(而是使用NHibernate),因此,我发现这毕竟可能不是代理对象问题。

我也不喜欢“巧合编码”,但我假设通过调用new MapWidget(),与GeoApi有关的一些初始化是在内部执行的-因为SharpMap在内部使用了GeoApi。

就我而言,我不是直接使用地图,而是只是使用NHibernate在数据库中插入一些地理数据,并且得到了完全相同的堆栈跟踪,因此我发现这可能是相同的问题。

我讨厌它,但我有这样的事情:

// my object to be persisted using NHibernate
var myObj = new MyObj();

// add polygon of type GeoAPI.Geometries.IGeometry
myObj.CoveredArea = myGeoFactory.CreatePolygonArea(/* ... */);

// use NHibernate to save my obj
sessioNScope.Save(myObj); // <- throws NotSupportedException here


和我一样,它给了我确切的例外。更改为

// Ignore this line: hack to initialize GeoApi
new Map();

// my object to be persisted using NHibernate
var myObj = new MyObj();

// add polygon of type GeoAPI.Geometries.IGeometry
myObj.CoveredArea = myGeoFactory.CreatePolygonArea(/* ... */);

// use NHibernate to save my obj
sessioNScope.Save(myObj);


它工作得很好。就我而言,我使用的是new Map()而不是new MapWidget(),因为它是一个winforms应用程序。

TLDR:将其视为执行初始化的黑客

关于c# - SharpMap和 Entity Framework :动态程序集中不支持调用的成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15317420/

10-11 16:44