SharpMap和实体框架:动态程序集中不支持调用的成员

本文关键字:不支持 集中 调用 成员 程序集 程序 实体 框架 动态 SharpMap | 更新日期: 2023-09-27 18:03:21

我在自定义"map小部件"组件中使用sharp map。为了填充映射,我想使用实体框架,它位于一个单独的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

我的项目结构是这样的:

Dashboard.exe

  • 应用程序。配置包含connectionstring
  • 引用SharpMap
  • 引用Domain.Dll
  • 包含MapWidget

Domain.dll

  • 包含DomainModel和Services
  • 使用实体模型实现持久性
  • 应用程序。配置包含连接字符串、实体框架配置节和实体框架连接工厂

我的问题是:

    为什么会这样?
  1. 我能做些什么来阻止它?(如果没有,有没有一个比Program.cs更好的地方来存放这些黑客代码)

感谢您的阅读,如果我没有说清楚,请让我澄清。

SharpMap和实体框架:动态程序集中不支持调用的成员

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

我也不喜欢"偶然编码",但我假设通过调用new MapWidget(),一些与GeoApi相关的初始化是在内部执行的-因为GeoApi是由SharpMap内部使用的。

在我的情况下,我没有直接使用地图,我只是使用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:认为它是一个hack,它执行初始化

这很可能是由于EF生成的动态代理。我不熟悉SharpMap,所以我不能评论它在EF之前初始化它有什么影响,但是你应该能够通过禁用代理创建来避免异常:

context.Configuration.ProxyCreationEnabled = false;

注意,这将禁用延迟加载和更改跟踪,因此首先仔细阅读本文:http://msdn.microsoft.com/en-us/data/jj592886