我有以下情况
项目A.
- Uses Castle Windsor v2.2
- Uses Project B via WindsorContainer
Run Code Online (Sandbox Code Playgroud)
项目B.
- Uses NHibernate
- Uses Castle Windsor v2.1
Run Code Online (Sandbox Code Playgroud)
在Project AI的bin文件夹中有dll Castle.DynamicProxy2.dll v2.2和NHibernate dll.现在问题是NHibernate依赖于Castle.DynamicProxy2.dll v2.1而不存在.我该如何解决这种情况.
我想知道我是否可以定义自定义程序集属性.现有属性按以下方式定义:
[assembly: AssemblyTitle("MyApplication")]
[assembly: AssemblyDescription("This application is a sample application.")]
[assembly: AssemblyCopyright("Copyright © MyCompany 2009")]
Run Code Online (Sandbox Code Playgroud)
有没有办法可以做到以下几点:
[assembly: MyCustomAssemblyAttribute("Hello World! This is a custom attribute.")]
Run Code Online (Sandbox Code Playgroud) 在我的程序中,如何读取AssemblyInfo.cs中设置的属性:
[assembly: AssemblyTitle("My Product")]
[assembly: AssemblyDescription("...")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Radeldudel inc.")]
[assembly: AssemblyProduct("My Product")]
[assembly: AssemblyCopyright("Copyright @ me 2008")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
Run Code Online (Sandbox Code Playgroud)
我想向我的程序用户显示一些这些值,所以我想知道如何从主程序和我正在使用的komponent程序集加载它们.
是否有Microsoft工具从命令行获取DLL文件的汇编版本?
(我知道我可以编写自己的工具.)
我有一个简单的Windows窗体(C#,. NET 2.0)应用程序,使用Visual Studio 2008构建.
我想支持多种UI语言,并使用表单的"Localizable"属性和特定于文化的.resx文件,本地化方面可以无缝轻松地工作.Visual Studio会自动将特定于文化的resx文件编译为附属程序集,因此在我编译的应用程序文件夹中,存在包含这些附属程序集的特定于文化的子文件夹.
我希望将应用程序部署(复制到位)作为单个程序集,但仍保留包含多组特定于文化的资源的能力.
使用ILMerge(或ILRepack),我可以将附属程序集合并到主可执行程序集中,但标准的.NET ResourceManager回退机制找不到编译到主程序集中的特定于文化的资源.
有趣的是,如果我采用我的合并(可执行)程序集并将其副本放入特定于文化的子文件夹中,那么一切正常!同样,当我使用Reflector(或ILSpy)时,我可以在合并的组合中看到主要和特定于文化的资源.但是将主程序集复制到特定于文化的子文件夹中无论如何都会破坏合并的目的 - 我真的需要只有一个单一程序集的副本......
我想知道是否有任何方法可以劫持或影响ResourceManager回退机制,以在同一个程序集中查找特定于文化的资源,而不是在GAC和文化命名的子文件夹中查找.我看到了以下文章中描述的回退机制,但没有关于它如何被修改的线索:BCL团队关于ResourceManager的博客文章.
有谁有想法吗?这似乎是一个相对常见的在线问题(例如,Stack Overflow上的另一个问题:" ILMerge和本地化资源程序集 "),但我没有在任何地方找到任何权威答案.
按照下面的casperOne的建议,我终于能够做到这一点.
我在这里提出解决方案代码,因为casperOne提供了唯一的答案,我不想添加自己的答案.
通过从"InternalGetResourceSet"方法中实现的Framework资源查找回退机制中拉出内容并使我们的同一组件搜索成为第一个使用的机制,我能够使它工作.如果在当前程序集中找不到资源,那么我们调用基本方法来启动默认搜索机制(感谢下面的@Wouter注释).
为此,我派生了"ComponentResourceManager"类,并且只覆盖了一个方法(并重新实现了一个私有框架方法):
class SingleAssemblyComponentResourceManager :
System.ComponentModel.ComponentResourceManager
{
private Type _contextTypeInfo;
private CultureInfo _neutralResourcesCulture;
public SingleAssemblyComponentResourceManager(Type t)
: base(t)
{
_contextTypeInfo = t;
}
protected override ResourceSet InternalGetResourceSet(CultureInfo culture,
bool createIfNotExists, bool tryParents)
{
ResourceSet rs = (ResourceSet)this.ResourceSets[culture];
if (rs == null) …Run Code Online (Sandbox Code Playgroud) 为什么MS最初决定维护这两个独立的核心库?也许他们考虑到了一些可伸缩性问题,但是现在我从来没有看到任何类型的应用程序都不需要这两者.有没有人有这方面的内幕消息?这不是很重要,但多年来一直在我的脑海里.
PS.我知道两个库中有什么,我知道不同之处 - 我是Reflector的忠实粉丝:)只是想知道两者的分离有什么实际用途.
如何在引用的程序集中获取调用Web应用程序的版本号?
我尝试过使用System.Reflection.Assembly.GetCallingAssembly().GetName()但它只是给我动态编译的程序集(返回版本号0.0.0.0).
更新:在我的情况下,我需要一个解决方案,不需要引用回Web应用程序集中的类.Jason在下面的答案(标记为已接受)符合此要求 - 此处提交的许多其他人都没有.
我有一个项目,通过他们的API为另一个应用程序添加一些可扩展性.但是,我希望能够为其应用程序的多个版本使用相同的项目,因为大多数代码都是相同的.
但是,每个版本的应用程序都需要引用该版本软件的正确程序集.他们将程序集加载到GAC中,所以即使我可以根据构建配置指定要使用的程序集的版本,我也没关系.有没有办法从VS内部执行此操作,还是需要外部构建工具?
我在我的项目中添加了对log4net程序集dll的引用.
当我建立时,我得到一个警告说:
警告程序集"Lib\log4net.dll"被错误地指定为文件.
当构建过程检测到文件引用实际上是(托管或本机)程序集时,在应用程序清单生成期间会生成此警告.
这正是我正在做的事情; 文件引用是一个程序集.我在这里被告知了什么?
如何在不添加对程序集dll的引用的情况下添加对程序集dll的引用?
我们目前在一个项目中有很多类,每个类都实现一个接口,主要是出于DI的原因.
现在,我个人的感觉是这些接口应该放在同一个程序集中的一个单独的命名空间中(所以我们有一个MyCompany.CoolApp.DataAccess程序集,并且在其中有一个Interfaces命名空间给出 MyCompany.CoolApp.DataAccess.Interfaces).
但是,有人建议这些接口实际上应该在它们自己的程序集中.我的问题是 - 他们是对的吗?我可以看到有一些好处(例如,其他项目只需要使用接口程序集),但在一天结束时,所有这些程序集都需要加载.在我看来,可能会有一个稍微复杂的部署问题,因为Visual Studio不会自动将实现程序集拉入目标的bin文件夹.
是否有针对此的最佳实践指南?
编辑:
为了使我的观点更清楚:我们已经将UI,DataAccess,DataModel和其他东西分成不同的程序集.我们当前也可以毫不费力地将我们的实现换成不同的实现,因为我们使用Unity(IOC框架)将实现类映射到接口.我应该指出,除了多态性的原因和为单元测试创建模拟之外,我们从不编写同一接口的两个实现.因此,除了单元测试之外,我们目前没有"换出"实现.
我看到在与实现相同的程序集中使用接口的唯一缺点是将加载整个程序集(包括未使用的实现).
但是,我可以看到将它们放在不同的程序集中意味着开发人员不会意外地"新"实现类而不是使用IOC包装器创建它.
我从答案中无法理解的一点是部署问题.如果我只是依赖于接口程序集,我会有类似以下结构的东西:
MyCompany.MyApplication.WebUI
References:
MyCompany.MyApplication.Controllers.Interfaces
MyCompany.MyApplication.Bindings.Interfaces
etc...
Run Code Online (Sandbox Code Playgroud)
当我构建它时,自动放入bin文件夹的程序集就是那些接口程序集.但是,我在单元格中的类型映射将不同的接口映射到它们的实际实现.包含我的实现的程序集如何最终在bin文件夹中?
assemblies ×10
.net ×6
c# ×3
attributes ×2
reference ×2
reflection ×2
asp.net ×1
build ×1
dll ×1
localization ×1
log4net ×1
namespaces ×1
version ×1
winforms ×1