我想知道,PCL究竟解决了什么?如果它只是限制我跨平台的类型,那么为什么微软只是通过IDE将它作为标准.NET库中的一个功能?
基本上,我可以轻松编译包含一些POCO对象的.NET库,并在我的Silverlight,WPF和Windows Store应用程序中引用该DLL,而无需重新编译或出现任何问题.是否有任何在PCL中有效的代码难以在标准.NET库中运行?
哦,我知道显然有一些东西可以在标准的.NET库中运行,我并不关心...我想我的问题是这样的:
是否有任何代码可以在可移植类库中编译,如果完全相同的代码在.NET库中,那么它将无法正常运行?
我正在开始对Visual-Studio 2008方式进行单元测试,我想知道class
为了测试目的,完成跨装配访问的最佳方法是什么.
基本上,我在一个解决方案中有两个项目:
MyProject中的所有内容当前都具有默认的可访问性,如果我没记错,这意味着一切都是有效的internal
.我主要是想在这个class
级别进行测试,但是有一些delegates
涉及.
将来某个时候可能会有一个外部API,但我大约有20%的功能完整(至少在纸面上)并且我非常谨慎地在这个未经测试的核心上层叠更多代码.因此,我想在应用程序完成足够传统(读取:坏和/或懒惰)功能测试之前完成一些测试,并且肯定在版本n + 1外部API启动之前完成.
除了直接的答案,我们将非常感谢解决方案的一个例子.
我有一个具有1个引用程序集的应用程序(test.exe,test.dll)
我想要的是在test.exe
运行时,它应该将发布者名称显示为"TestCompany".
为此,我对它进行了数字签名,它就是我想做的.如果我改变test.exe
发布者名称的一个字节是"未知".这很好.
但是,如果我改变了test.dll
,应用程序运行时没有任何反应,并将发布者名称显示为"TestCompany".哪个对我不好.
所以我把强名称放在app.config中test.dll
并添加<bypassTrustedAppStrongNames enabled="false" />
.
再一次,没有区别.所以我再次搜索并发现bypassTrustedAppStrongNames
只检查程序集是否具有强名称.不是验证.这对我来说再好不过了.
我真正想要的是保护用户,而不是我的应用程序.如果用户运行我的应用程序并且它从我这里说出来,它必须来自我的每个字节.如果应用程序被更改,即使是单个字节,它也必须通知用户,而不是来自我.这是数字签名与强名称一起做的,但它们似乎都不是那么好.或者我错过了什么?
我能想到的最后一种可能的方法是手动检查程序集的强名称.
PS:目标.net框架是2.0
Newtonsoft.Json发布具有相同强名称的不兼容版本,仅更改文件版本.
根据MSDN:
具有相同强名称的程序集应该相同.
因此,如果我们无法控制的其他应用程序将不同版本的Newtonsoft.Json.dll放入GAC,我们的应用程序就会中断.
有没有办法强制.NET加载我们需要的特定版本?
更新:
让我更深入地解释这个问题:
在.NET中,据我所知,在CLR尝试解决它们并失败之前,没有机制来解析程序集.
只有AppDomain.AssemblyResolve事件,它仅在未解析程序集时触发.通常它就足够了.
但是在Newtonsoft.Json的情况下,它并没有解决程序集,但它只是加载错误的程序集.
发生这种情况是因为Newtonsoft.Json发布了具有相同强名称的不兼容版本.
例:
假设我们的应用程序针对NJdll编译(程序集版本1.0,文件版本1.0)
然后一些其他应用程序,将其他不兼容版本的相同dll放入GAC NJdll(程序集版本1.0,文件版本1.1)
因为它们只更改文件版本而不更改程序集版本,所以这两个程序集具有相同的强名称.
因此,对于我们的应用程序.NET尝试解析NJdll(程序集版本1.0),它会在GAC中看到dll并加载它.(因为.NET总是喜欢从GAC组装来装配"bin"文件夹)
但装载的装配是错误的.它的文件版本为1.1,与1.0版本不兼容.
因为两个程序集都具有相同的程序集版本,所以.NET看不到它们之间的任何差异.但是当它实际上尝试解决内部的某个类或成员时,它会失败,因为它在版本1.1中已更改.
并且整个应用程序因不可预测的错误而失败.
最糟糕的是,即使我的应用程序没有将newtonsoft.json.dll放入GAC,我控制之外的其他一些应用程序也会将不同版本的newtonsoft.json.dll放入GAC - 我的应用程序会因不可预测而中断例外.
所以我的问题是,在.NET加载错误之前,我可以首先加载正确的程序集吗?
更新
https://github.com/JamesNK/Newtonsoft.Json/issues/615 https://github.com/JamesNK/Newtonsoft.Json/issues/1001
这个问题的问题已经结束,评论显示Newtonsoft.Json的作者不了解.NET版本以及为什么这很重要.
.net versioning json.net global-assembly-cache .net-assembly
我遇到了一个奇怪的问题.
我基本上拥有自己的.NET-core网络堆栈,我已经将其构建到一些.dll中,我想从另一个ASP CORE解决方案中引用它们.
VS似乎找到了程序集,我可以在其中导航类型等.我也可以构建项目没有任何问题,但当IIS然后运行服务器时,我得到一个内部服务器错误说明:
FileNotFoundException:无法加载文件或程序集' myDLL,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'.该系统找不到指定的文件.
引用的DLL位于debug-folder中,真正奇怪的是如果我在与Web堆栈相同的解决方案中创建一个新的ASP Core项目,我可以毫无问题地引用和使用它.
为什么只有在web-stack解决方案之外的项目上运行时才会发生这种情况,我该怎样做才能让它在任何地方都可以运行?
我正在进行一个特别困难的重构会话,涉及在Visual Studio 2012中有多个项目的C#解决方案.我需要将一堆代码提取到他们自己的程序集中,以便代码可以在多个项目中共享,所有这些都在同一个解决方案中.但是,无论我尝试什么,我都会收到引用新共享项目的项目的警告"所有项目引用{共享项目名称}必须安装nuget包Microsoft.Bcl.Build".
我已经完成了依赖项目和带有细齿梳的共享项目,详细验证了它们都使用相同的版本和完全相同的DLL用于Microsoft.Bcl版本1.0.1.19和Microsoft.Bcl.Async版本1.0. 16个包裹:
System.Threading.Tasks
Microsoft.Threading.Task
DLL路径都已解析且相同.XAP文件确实构建但我仍然得到警告告诉我,依赖项目中没有引用Microsoft.Bcl.Build,尽管事实上我可以看到它.
如果我尝试卸载然后使用NuGet为所涉及的每个项目重新安装这两个软件包,我会获得带有空路径的引用和所涉及的5个DLL引用的警告图标.由于某种原因,NuGet添加了引用但无法找到DLL.另外,如果我这样做,我发现自己经常遇到这样的问题:在尝试添加引用时,我会收到"无法添加引用"错误的项目.然后我关闭并重新打开解决方案,这导致"项目无法加载"错误.所以我必须手动编辑项目文件,删除错误的包导入语句,然后重新加载项目.
我该如何解决这个问题以及将来避免这种头痛的一般技术是什么?让NuGet管理丢失的软件包并没有帮助.
该AssemblyTitle
属性的实际用途是什么?MSDN表示它指定了程序集的描述,并且程序集标题是一个友好名称,可以包含空格.
Visual Studio在项目的属性窗口中询问程序集名称以及默认名称空间.有一个AssemblyName
属性,但它完整地描述了一个程序集的唯一标识(即文化等).我看不出有什么AssemblyTitle
不同AssemblyProduct
.
我使用IL反汇编程序来查看Microsoft如何使用AssemblyTitle
.我发现在mscorlib.dll中AssemblyTitle
,AssemblyProduct
和AssemblyDefaultAlias
都设置为"mscorlib.dll"
.
总之,我真正希望看到的是使用的实际例子AssemblyTitle
.
假设我有一个AppDomain.AssemblyResolve
事件处理程序,在处理程序中我构造一个字节数组并调用该方法Assembly.Load(byte[])
.此方法本身是否会AssemblyResolve
再次引发事件,并导致我的处理程序重新进入?
我的问题不仅限于可以使用C#编译器生成的程序集,它们可以包含CLR支持的abritrary元数据和可执行代码.
我做了一些实验,发现时没有发现任何情况.我试图加载需要额外引用的程序集,尝试将CAS属性添加到加载的程序集,其解码需要另一个程序集,尝试使用模块初始化程序(全局.cctor
方法)加载程序集.在任何情况下,我都没有观察到AssemblyResolve
要从Assembly.Load(byte[])
方法内部引发的事件,只有在某些代码稍后尝试访问加载的程序集中的类型,方法或属性时才会发生.但我可以在这里遗漏一些东西.
过去在RC.x中工作的东西都不再有用了.
我试过这些:
PlatformServices.Default.Application.ApplicationVersion;
typeof运算(控制器).GetTypeInfo()Assembly.GetCustomAttribute <AssemblyFileVersionAttribute>()版.;
他们都返回1.0.0.0代替1.0.0-9这应该是执行后,dotnet publish --version-suffix 9
在具有这种project.json: "version": "1.0.0-*"
基本上他们从附图中给我"文件版本"而不是"产品版本",它dotnet publish
实际上似乎有所改变.
我需要在我的配置文件中加载2个版本的程序集Newtonsoft.Json vesion 4.0.8.0和4.5.0.0:
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.8.0" newVersion="4.0.8.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)
但我需要旧4.0.8.0和新的4.5.0.0
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.8.0" newVersion="4.5.0.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)
我从Package Console安装了最新版本,但它给了我错误:
错误80无法加载文件或程序集'Newtonsoft.Json,Version = 4.5.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)
.net-assembly ×10
c# ×7
.net ×6
.net-core ×2
json.net ×2
.net-4.5 ×1
asp.net-core ×1
attributes ×1
clr ×1
nuget ×1
packages ×1
reflection ×1
strongname ×1
unit-testing ×1
version ×1
versioning ×1