Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架数据库第一个关于dll的奇怪行为_C#_.net_Sql Server_Entity Framework_Dll - Fatal编程技术网

C# 实体框架数据库第一个关于dll的奇怪行为

C# 实体框架数据库第一个关于dll的奇怪行为,c#,.net,sql-server,entity-framework,dll,C#,.net,Sql Server,Entity Framework,Dll,我有一个远程SQL Server数据库,在dll中用实体框架包装。 当我从主应用程序引用该dll时,我会收到一个运行时异常,声明“app.settings文件中缺少连接字符串”,或者,如果我手动添加连接字符串,“找不到实体框架引擎”。 相反,如果我也在主应用程序中安装来自NuGet的EF,则引用的dll可以完美地工作 现在,我创建并引用dll的原因是将我的业务层与持久层分离,但是如果我需要对EF的引用以使我的应用程序工作,我就失去了dll包装的优势 我该怎么办 编辑: 我无法将依赖项从我的主应用

我有一个远程SQL Server数据库,在dll中用实体框架包装。 当我从主应用程序引用该dll时,我会收到一个运行时异常,声明“app.settings文件中缺少连接字符串”,或者,如果我手动添加连接字符串,“找不到实体框架引擎”。 相反,如果我也在主应用程序中安装来自NuGet的EF,则引用的dll可以完美地工作

现在,我创建并引用dll的原因是将我的业务层与持久层分离,但是如果我需要对EF的引用以使我的应用程序工作,我就失去了dll包装的优势

我该怎么办

编辑:
我无法将依赖项从我的主应用添加到EF,因为该dll的用户将是.NET之外的客户端,例如Excel或Matlab Instance。dll从来没有自己的配置文件,可以访问连接字符串等读取设置。尽管用于读取配置信息的代码可能在程序集中,但配置文件归主机进程所有,因此主机进程配置文件中必须存在连接字符串条目

在您的场景中,听起来在远程服务器上,将由SQL server充当主机进程。在本地计算机上,主机进程(您的.exe或网站,IIS Wp3)将充当主机进程。您的本地进程将需要web.config/app/config中的connectionstring设置

在VS中,当我们添加对程序集项目的引用时,所有依赖的.dll都将被编译并放置在顶级应用程序bin文件夹中。如果只是从应用程序中引用.dll文件,则这些依赖的.dll文件不会放在bin文件夹中。这就是您在EF的体验

可以将EF功能封装在.dll文件中,但组成EF本身的.dll文件必须对主机进程可用。您不需要向主应用程序添加NuGet引用。通过在主应用程序中引用生成.dll的项目,EF引擎将编译到主应用程序的bin文件夹中


构建和部署主应用程序以及对程序集的项目引用后,所有必需的文件都将位于执行应用程序的文件夹中。然后,您可以对.dll源代码进行更改,只需更新应用程序文件夹中的.dll二进制文件,前提是这些更改不会破坏契约等,例如方法签名。

dll从来没有自己的配置文件,它可以访问这些文件来读取设置,例如连接字符串。尽管用于读取配置信息的代码可能在程序集中,但配置文件归主机进程所有,因此主机进程配置文件中必须存在连接字符串条目

在您的场景中,听起来在远程服务器上,将由SQL server充当主机进程。在本地计算机上,主机进程(您的.exe或网站,IIS Wp3)将充当主机进程。您的本地进程将需要web.config/app/config中的connectionstring设置

在VS中,当我们添加对程序集项目的引用时,所有依赖的.dll都将被编译并放置在顶级应用程序bin文件夹中。如果只是从应用程序中引用.dll文件,则这些依赖的.dll文件不会放在bin文件夹中。这就是您在EF的体验

可以将EF功能封装在.dll文件中,但组成EF本身的.dll文件必须对主机进程可用。您不需要向主应用程序添加NuGet引用。通过在主应用程序中引用生成.dll的项目,EF引擎将编译到主应用程序的bin文件夹中


构建和部署主应用程序以及对程序集的项目引用后,所有必需的文件都将位于执行应用程序的文件夹中。然后,您可以更改.dll源代码,只需更新应用程序文件夹中的.dll二进制文件,前提是这些更改不会破坏契约等,例如方法签名。

您的所有依赖项都会遇到相同的问题。您必须分发多个DLL并确保它们已加载。看

AssemblyLoad事件允许您接管AppDomain的程序集加载过程,您可以在正常搜索位置(依赖于host.exe位置)之外的磁盘上找到依赖的程序集,或者下载它们,或者从main.dll中的程序集资源中解包它们


另请参见

所有依赖项都会出现相同的问题。您必须分发多个DLL并确保它们已加载。看

AssemblyLoad事件允许您接管AppDomain的程序集加载过程,您可以在正常搜索位置(依赖于host.exe位置)之外的磁盘上找到依赖的程序集,或者下载它们,或者从main.dll中的程序集资源中解包它们


另请参见

您是否已发布应用程序并在远程计算机上安装?仅当远程计算机上的Net版本与您编译的版本相同时,编译的VS才会工作。发布将安装远程计算机上缺少的缺少的windows库(Net)。Publish会生成一个安装文件夹,就像商业软件一样,应用程序在其他计算机上工作所需。请确认“找不到实体框架引擎”是确切的错误消息?如果没有,请发布准确的错误消息。此外,复制引用EF的单个.dll将不可调用,除非EF dll。文件也存在并可供需要使用它们的进程使用。我不认为Switc