标签: .net-assembly

便携式类库实际上解决了什么?

我想知道,PCL究竟解决了什么?如果它只是限制我跨平台的类型,那么为什么微软只是通过IDE将它作为标准.NET库中的一个功能?

基本上,我可以轻松编译包含一些POCO对象的.NET库,并在我的Silverlight,WPF和Windows Store应用程序中引用该DLL,而无需重新编译或出现任何问题.是否有任何在PCL中有效的代码难以在标准.NET库中运行?


哦,我知道显然有一些东西可以在标准的.NET库中运行,我并不关心...我想我的问题是这样的:

是否有任何代码可以在可移植类库中编译,如果完全相同的代码在.NET库中,那么它将无法正常运行?

.net c# .net-assembly portable-class-library .net-4.5

22
推荐指数
2
解决办法
1万
查看次数

如何访问另一个程序集中的类以进行单元测试?

我正在开始对Visual-Studio 2008方式进行单元测试,我想知道class为了测试目的,完成跨装配访问的最佳方法是什么.

基本上,我在一个解决方案中有两个项目:

  1. MyProject(C#)
  2. MyProjectTests(C#测试项目)

MyProject中的所有内容当前都具有默认的可访问性,如果我没记错,这意味着一切都是有效的internal.我主要是想在这个class级别进行测试,但是有一些delegates涉及.

将来某个时候可能会有一个外部API,但我大约有20%的功能完整(至少在纸面上)并且我非常谨慎地在这个未经测试的核心上层叠更多代码.因此,我想在应用程序完成足够传统(读取:坏和/或懒惰)功能测试之前完成一些测试,并且肯定在版本n + 1外部API启动之前完成.

除了直接的答案,我们将非常感谢解决方案的一个例子.

c# unit-testing .net-assembly

21
推荐指数
1
解决办法
1万
查看次数

对具有引用程序集的应用程序进行数字签名的正确方法

我有一个具有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

.net c# strongname digital-certificate .net-assembly

21
推荐指数
1
解决办法
583
查看次数

Newtonsoft Json.NET版本不兼容(DLL地狱)

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

21
推荐指数
1
解决办法
4436
查看次数

ASP .NET CORE无法使用自定义程序集查找文件或程序集

我遇到了一个奇怪的问题.

我基本上拥有自己的.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解决方案之外的项目上运行时才会发生这种情况,我该怎样做才能让它在任何地方都可以运行?

c# .net-assembly .net-core asp.net-core

21
推荐指数
1
解决办法
1万
查看次数

引用子项目的所有项目必须安装NuGet包Microsoft.Bcl.Build(C#/ Windows Phone 7)?

我正在进行一个特别困难的重构会话,涉及在Visual Studio 2012中有多个项目的C#解决方案.我需要将一堆代码提取到他们自己的程序集中,以便代码可以在多个项目中共享,所有这些都在同一个解决方案中.但是,无论我尝试什么,我都会收到引用新共享项目的项目的警告"所有项目引用{共享项目名称}必须安装nuget包Microsoft.Bcl.Build".

我已经完成了依赖项目和带有细齿梳的共享项目,详细验证了它们都使用相同的版本和完全相同的DLL用于Microsoft.Bcl版本1.0.1.19和Microsoft.Bcl.Async版本1.0. 16个包裹:

  • System.Runtime
  • System.Threading.Tasks

  • Microsoft.Threading.Task

  • Microsoft.Threading.Tasks.Extensions
  • Microsoft.Threading.Tasks.Extensions.Phone

DLL路径都已解析且相同.XAP文件确实构建但我仍然得到警告告诉我,依赖项目中没有引用Microsoft.Bcl.Build,尽管事实上我可以看到它.

如果我尝试卸载然后使用NuGet为所涉及的每个项目重新安装这两个软件包,我会获得带有空路径的引用和所涉及的5个DLL引用的警告图标.由于某种原因,NuGet添加了引用但无法找到DLL.另外,如果我这样做,我发现自己经常遇到这样的问题:在尝试添加引用时,我会收到"无法添加引用"错误的项目.然后我关闭并重新打开解决方案,这导致"项目无法加载"错误.所以我必须手动编辑项目文件,删除错误的包导入语句,然后重新加载项目.

我该如何解决这个问题以及将来避免这种头痛的一般技术是什么?让NuGet管理丢失的软件包并没有帮助.

c# packages .net-assembly visual-studio nuget

20
推荐指数
2
解决办法
2万
查看次数

.NET Framework中的"AssemblyTitle"属性

AssemblyTitle属性的实际用途是什么?MSDN表示它指定了程序集的描述,并且程序集标题是一个友好名称,可以包含空格.

Visual Studio在项目的属性窗口中询问程序集名称以及默认名称空间.有一个AssemblyName属性,但它完整地描述了一个程序集的唯一标识(即文化等).我看不出有什么AssemblyTitle不同AssemblyProduct.

我使用IL反汇编程序来查看Microsoft如何使用AssemblyTitle.我发现在mscorlib.dllAssemblyTitle,AssemblyProductAssemblyDefaultAlias都设置为"mscorlib.dll".

总之,我真正希望看到的是使用的实际例子AssemblyTitle.

.net c# attributes .net-assembly

20
推荐指数
3
解决办法
1万
查看次数

可以调用Assembly.Load(byte [])来引发AppDomain.AssemblyResolve事件吗?

假设我有一个AppDomain.AssemblyResolve事件处理程序,在处理程序中我构造一个字节数组并调用该方法Assembly.Load(byte[]).此方法本身是否会AssemblyResolve再次引发事件,并导致我的处理程序重新进入?

我的问题不仅限于可以使用C#编译器生成的程序集,它们可以包含CLR支持的abritrary元数据和可执行代码.

我做了一些实验,发现时没有发现任何情况.我试图加载需要额外引用的程序集,尝试将CAS属性添加到加载的程序集,其解码需要另一个程序集,尝试使用模块初始化程序(全局.cctor方法)加载程序集.在任何情况下,我都没有观察到AssemblyResolve要从Assembly.Load(byte[])方法内部引发的事件,只有在某些代码稍后尝试访问加载的程序集中的类型,方法或属性时才会发生.但我可以在这里遗漏一些东西.

.net c# reflection clr .net-assembly

20
推荐指数
1
解决办法
1393
查看次数

在ASP.NET Core 1.0.0 Web应用程序中显示项目版本

过去在RC.x中工作的东西都不再有用了.

我试过这些:

  1. PlatformServices.Default.Application.ApplicationVersion;

  2. typeof运算(控制器).GetTypeInfo()Assembly.GetCustomAttribute <AssemblyFileVersionAttribute>()版.;

  3. .Assembly.GetEntryAssembly()的GetName()Version.ToString();

他们都返回1.0.0.0代替1.0.0-9这应该是执行后,dotnet publish --version-suffix 9在具有这种project.json: "version": "1.0.0-*"

基本上他们从附图中给我"文件版本"而不是"产品版本",它dotnet publish实际上似乎有所改变.

在此输入图像描述

version .net-assembly .net-core

20
推荐指数
3
解决办法
1万
查看次数

与Newtonsoft.Json的装配冲突

我需要在我的配置文件中加载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 json.net .net-assembly

19
推荐指数
2
解决办法
4万
查看次数