我正在阅读Bill Wagner的书" Effective C#".在第32项中,他主张开发人员创建更小,更有凝聚力的组件,可以更容易地重用.然而,在同一个项目中,他说:
...额外的安全检查也是在装配边界上完成的.来自同一程序集的所有代码具有相同的信任级别(不一定是相同的访问权限,但具有相同的真实级别).每当代码流穿过程序集边界时,CLR都会执行一些安全检查.程序流程跨越程序集边界的次数越少,效率就越高......这些性能问题都不能阻止您分解太大的程序集.性能处罚很轻微.
我的问题是,是否对Foo.dll中的每个方法调用执行了额外的安全检查,还是仅在第一次加载程序集时执行?
谢谢
我正在使用Maven及其程序集插件来构建我的项目的分发包,如下所示:
现在,我正在添加另一个解压缩ZIP的项目,将所有其他JAR放入正确的目录中,然后重新打包以进行分发.现在,我的bundle可能包含我要合并到的配置文件,而不是替换运行时程序集中名称相同的配置文件.我怎么做?
这些文件是纯文本(属性文件),但稍后我可能会遇到与XML文件类似的情况.
我在Asp.Net MVC 4项目中解决404响应时遇到问题.它内置于VS2012,目标4.5.
我有预编译的视图和控制器内置到独立的DLL中.我能够动态加载DLL并从我的核心项目中检查它们,甚至调用它们的方法; 但是,似乎MVC框架并不知道控制器.我在附近,但有些东西不见了.
控制器和视图的背景
控制器构建在独立的MVC项目中并继承自Controller.没有什么太有趣了.视图使用RazorGenerator并成为项目中的类.
项目的输出是一个DLL,它正确包含控制器和视图.
这些DLL IPlugin在库中的一个单独的类(不是控制器的一部分)中实现一个特定的接口,我们称之为它.
加载DLL
在Visual Studio中以管理员身份运行我编译我的应用程序,该应用程序在IIS下托管.随着项目的建立,我将插件DLL放入我的"插件"目录.没有调试(这在以后变得很重要),我打开IE并导航到该站点. 请注意,此时App已构建,但从未运行,因此将启动启动事件.如果我回收应用程序池,这里的一切仍然是一致的.
我有Startup两种方法类,PreStart并PostStart使用调用方法WebActivator.PreApplicationStartMethod和WebActivator.PostApplicationStartMethod分别.
PreStart 我在哪里做以下事情:
AppDomain.CurrentDomain.DynamicDirectoryIPlugin我那么
在'PostStart'中我做了一些代码(基于RazorGenerator.Mvc的代码):
foreach (var assembly in Modules.Select(m=>m.Value))
{
var engine = new PrecompiledMvcEngine(assembly)
{
UsePhysicalViewsIfNewer = HttpContext.Current.Request.IsLocal
};
ViewEngines.Engines.Insert(0, engine);
VirtualPathFactoryManager.RegisterVirtualPathFactory(engine);
}
Run Code Online (Sandbox Code Playgroud)
Modules在此上下文中是键/值对,其中值是加载的程序集.此代码的目的是通过为知道如何解析视图的每个程序集添加视图引擎来确保MVC知道视图(这是RazorGenerator的一部分).
我怎么知道我很接近(但显然缺乏雪茄)
IPlugin定义一个名为RegisterRouteswhere 的方法,你猜对了,为那些实现接口的人注册了路由.我调用此方法PreStart并添加路由 - 我已经验证了这些存在于我的路由表中.例如,在我的插件中定义的路由,通过在此期间动态调用方法创建的路径PreStart,我在检查路由时看到类似这样的DataToken:
Namespaces = Plugin.Name.Controllers
Run Code Online (Sandbox Code Playgroud)
因此,路由已注册,程序集已加载,我已验证DLL已正确复制到AppDomain的DynamicDirectory.我可以调用在运行时动态加载的类的成员.但是当我导航到路线匹配的URL时,我得到了404.这不是 …
我收到以下MSB3644并发症错误:
找不到框架".NETFramework,Version = v4.0"的引用程序集.要解决此问题,请为此框架版本安装SDK或Targeting Pack,或者将应用程序重新定位到已安装SDK或Targeting Pack的框架版本.请注意,程序集将从全局程序集缓存(GAC)中解析,并将用于代替引用程序集.因此,您的程序集可能无法正确定位到您想要的框架.
从我在这里读到的,这是由于我的机器上的程序集存储在"程序文件"而不是"程序文件(x86)"中.FrameworkPathOverrideMSBuild上的属性可以修复它.
我已经尝试将此属性(FrameworkPathOverride)添加到csproj:
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\tools\common.props" />
<PropertyGroup>
<TargetFrameworks>net40;net45;netstandard1.2</TargetFrameworks>
<GeneratePackageOnBuild>False</GeneratePackageOnBuild>
<FrameworkPathOverride>C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0</FrameworkPathOverride>
</PropertyGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net40' ">
<Reference Include="System.Configuration" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net45' ">
<Reference Include="System.Configuration" />
</ItemGroup>
<PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard1.2' ">
<DefineConstants>$(DefineConstants);NETSTANDARD</DefineConstants>
</PropertyGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.2' ">
</ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
那个错误然后消失了,但我的所有类型和命名空间都无法解决,我也得到了这个构建警告:
MSB3270正在构建"AMD64"的项目的处理器体系结构与参考"C:\ Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll","x86"的处理器体系结构之间存在不匹配.这种不匹配可能会导致运行时故障.请考虑通过Configuration Manager更改项目的目标处理器体系结构,以便在项目和引用之间调整处理器体系结构,或者依赖于具有与项目的目标处理器体系结构相匹配的处理器体系结构的引用.
将项目的目标框架设置为x86后,警告消失,但仍然没有类型或命名空间可以解析.
我安装了所有必要的框架:
我在Windows 10上使用Visual Studio 2017.
msbuild assemblies visual-studio visual-studio-2017 .net-standard
如何在编译后读取.csproj中的AssemblyFileVersion或其组件AssemblyFileMajorVersion,AssemblyFileMinorVersion,AssemblyFileBuildNumber,AssemblyFileRevision?
我尝试了以下从构建的程序集中提取信息:
<Target Name="AfterCompile">
<GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
<Output
TaskParameter="Assemblies"
ItemName="MyAssemblyIdentities"/>
</GetAssemblyIdentity>
<Message Text="AssemblyVersion = %(MyAssemblyIdentities.Version)" />
</Target>
Run Code Online (Sandbox Code Playgroud)
但是,它检索AssemblyVersion而不是AssemblyFileVersion.对于后者,似乎没有记录的元数据条目.我也尝试过:
<Import Project="$(MSBuildExtensionsPath)\ExtensionPack\MSBuild.ExtensionPack.tasks" />
<Target Name="AfterCompile">
<MSBuild.ExtensionPack.Framework.Assembly TaskAction="GetInfo" NetAssembly="$(TargetPath)">
<Output TaskParameter="OutputItems" ItemName="Info" />
</MSBuild.ExtensionPack.Framework.Assembly>
<Message Text="AssemblyFileVersion = %(Info.FileVersion)" />
</Target>
Run Code Online (Sandbox Code Playgroud)
不幸的是,虽然这会检索正确的值,但它也会锁定程序集,直到VS2008关闭.
坦率地说,我不想要什么,因为我宁愿直接从AssemblyInfo.cs读取信息.但是,我无法弄清楚如何做到这一点.我假设MSBuild Extensions中的AssemblyInfo是一种方式,但它似乎专注于写入AssemblyInfo而不是从中检索值.
我怎样才能最好地完成这个?
我想更新生产Web应用程序中的类库(单个DLL文件).此Web应用程序已预编译(已发布).我在StackOverflow上读了一个答案(抱歉,似乎无法找到它,因为搜索功能不能很好地工作),这让我相信我可以将新的DLL粘贴到bin文件夹中并且它会被选中没有问题(这会导致WP回收,这对我来说很好,因为我们不使用InProc会话状态).
但是,当我尝试这个时,我的网站爆炸并提供一个FileLoadException,说明程序集清单定义与程序集引用不匹配.这个世界到底是什么?!在Visual Studio中更新DLL并重新部署整个站点工作得很好,但后面是一个巨大的痛苦.如果必须重新部署整个站点以实现任何更改,那么拥有单独的DLL有什么意义呢?
这是一个问题:如何在不破坏应用程序且不重新部署所有文件的情况下更新生产网站上的DLL?
我有一些函数可以读取和修改文件.为了使单元测试独立于任何文件系统问题,我想将文件包含在项目中.
但是,我的函数应该是获取filePath,而我从程序集中获得的只是一个FileStream.知道如何在项目中获取资源文件的文件路径吗?
System.Reflection.Assembly a = System.Reflection.Assembly.Load(assemblyName);
FileStream stream = a.GetFile(assemblyName + "." + fileName);
Run Code Online (Sandbox Code Playgroud)
谢谢!
我试图通过以下方式加载程序集:
Assembly component = Assembly.LoadFrom(componentPath);
Run Code Online (Sandbox Code Playgroud)
其中componentPath是网络位置的完整路径,并获得以下错误:
尝试从网络位置加载程序集,这会导致程序集在以前版本的.NET Framework中被沙箱化.
此版本的.NET Framework默认情况下不启用CAS策略,因此此负载可能很危险.
如果此加载不是用于沙盒程序集,请启用loadFromRemoteSources开关.有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=155569.
你能解释我该怎么做才能避免这种安全检查吗?
谢谢
我正在尝试部署CLR TVF(表值函数).在代码中我使用JavaScriptSerializer来解析一些JSON字符串,所以我引用了System.Web.Extensions dll,我的问题从那里开始.
项目构建正常,但当我尝试注册该DLL时,我收到以下错误:
程序集"my_assembly_name"引用程序集"system.web.extensions,version = 4.0.0.0,culture = neutral,publickeytoken = 31bf3856ad364e35.",这在当前数据库中不存在.SQL Server尝试从引用程序集来自的相同位置定位并自动加载引用的程序集,但该操作失败(原因:2(系统找不到指定的文件.)).请将引用的程序集加载到当前数据库中,然后重试您的请求.
我从以下引用了system.web.extensions:
C:\ Program Files(x86)\ Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\System.Web.Extensions.dll
我可以将复制加载设置为true或手动复制程序集,但随后引用错误会更深入 -
程序集"my_assembly_name"引用程序集"system.servicemodel.activation,version = 4.0.0.0,culture = neutral,publickeytoken = 31bf3856ad364e35.",这在当前数据库中不存在.SQL Server尝试从引用程序集来自的相同位置定位并自动加载引用的程序集,但该操作失败(原因:2(系统找不到指定的文件.)).请将引用的程序集加载到当前数据库中,然后重试您的请求.
一切正常,直到我引用Web.Extensions.dll.目标框架是.NET 4.
任何想法/解决方案?
请耐心等待我,我会尽可能清楚地解释.
我开始了一个新项目(类库),其目标是4.5而不是客户端配置文件4.5.
我添加了一个引用"System.Runtime.Serialization",属性表明它位于"C:\ Program Files(x86)\ Reference Assemblies\Microsoft\Framework.NETFramework\v4.5\System.Runtime.Serialization.dll"的位置
在我的电脑上,使用msbuild编译构建脚本可以很好地编译.
在使用团队城市的构建服务器上 - 它抱怨
错误CS0012:类型'System.Object'在未引用的程序集中定义.您必须添加对程序集'System.Runtime,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'的引用
buildserver安装了完整的.net框架 - "dotnetfx45_full_x86_x64.exe"
它将构建的唯一时间是将我的"C:\ Program Files(x86)\ Reference Assemblies\Microsoft\Framework.NETFramework\v4.5"版本复制到目标计算机.
我已经使用此链接进行了检查并安装了.net 4.5 - http://myspworld.wordpress.com/2012/10/18/how-to-check-if-net-4-5-is-installed-on-a -服务器/
我问两个问题:1.如何安装?2.如果它确实在这个位置找到它肯定应该在GAC中查找?
将不胜感激任何帮助.
assemblies ×10
.net ×4
c# ×4
msbuild ×2
.net-4.5 ×1
asp.net ×1
asp.net-mvc ×1
c#-4.0 ×1
clr ×1
deployment ×1
maven-2 ×1
performance ×1
reference ×1
sql-server ×1
sqlclr ×1
unit-testing ×1
versioning ×1