该的AssemblyVersion和的AssemblyFileVersion属性是处理版本号为.NET程序集的内置方式.虽然框架提供了自动确定版本号(构建和修订,在Microsoft术语中)中最不重要部分的能力,但我发现这种方法相当薄弱,而且毫无疑问还有许多其他方法.
所以我想问一下,有哪些方法可以确保最好地使用更好地反映项目实际版本的版本号?您是否有预构建脚本将版本的一部分设置为日期和时间,或者是项目工作副本的存储库版本?您是否只使用框架提供的自动生成?或者是其他东西?管理汇编/文件版本控制的最佳方法是什么?
是否有任何理由为.NET程序集使用一种版本控制风格?
我想知道使用除味道之外的任何一种风格是否有任何优点/缺点.
我们目前正在测试Mono,看看我们的.NET DLL是否适用于Linux上的客户.我们的DLL为Windows窗体提供组件.我将DLL放在Debug目录中,添加了引用,并创建了一个从Windows窗体派生的类.该类运行良好独立,但在我添加了DLL引用并创建了我们的一个组件(intellisense工作正常)后,它编译但不会运行:
** (/home/aldwin/testMonoWF/testMonoWF/bin/Debug/testMonoWF.exe:26905): WARNING **: Could not load file or assembly 'OUR.ASSEMBLY, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ATOKEN' or one of its dependencies. Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'OUR.ASSEMBLY, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ATOKEN' or one of its dependencies. File name: 'OUR.ASSEMBLY, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ATOKEN'
我查看了程序集的属性,它是带有该公钥的版本.
有没有办法让我使用这些DLL?我究竟做错了什么?
编辑:
根据MoMA的说法,除了一些与情况无关的[MonoTodo]之外,其中三个DLL存在一个问题:
Calling Method | P/Invoke Method | P/Invoke Library void OnHandleCreated (EventArgs) | int GoText/ComboBoxControl.SetWindowTheme (IntPtr, string, string) | uxtheme.dll
但是,我打开了一个用VS2008创建的示例项目,在正确的位置指向DLL的引用,它工作正常.但我无法获得在新项目中工作的参考.难道我做错了什么?
编辑2:为了澄清,我们不想重新创建现有的Windows应用程序 - 我们正在模拟客户使用我们的dll创建一个新的应用程序.我只是测试它是否是一个DLL问题.由于VS制作的应用程序能够找到dll并成功运行,看起来这不是一个DLL问题.新应用程序不会调用VS创建的应用程序所没有的任何内容.
我有一个名为"MyAssembly"的类库,它在内部引用a.dll,版本3.1.1.0的b.dll; 我已经构建了一个超出MyAssembly.dll的项目.在另一个系统(框)上,我创建了一个Web应用程序项目并引用了MyAssembly.dll.新系统有新版本的a.dll和b.dll 4.0.0; 我在web.config中使用绑定重定向,如下所示.但仍然无法编译Web应用程序.它说缺少程序集引用a.dll,版本3.1.1.0.
任何人都可以帮助解决这个问题吗?
谢谢,Suresh
我最初打算使用签名的序列化xml文件来存储许可证详细信息.在规划中,越来越多的人进入了这个"许可证文件",这将允许我们通过提供的许可证文件分发单个应用程序并控制可用的功能.
用户界面和打印的报告与经销商徽标共同标记,因此如果将其嵌入到许可证中将会很好.我知道这可以用序列化的xml文件完成,但我想知道在编译的程序集中存储这些数据的优点和缺点是什么?
许可证生成工具可以使用适当的属性和资源编译程序集并对其进行签名.
更新
从我所看到的,使用序列化的xml或程序集将非常相似.从我的角度来看,程序集将允许我添加其他资源并为将来留下一些灵活性.一旦资源变得复杂,xml序列化就很麻烦.
Update2
该软件仅适用于我们的硬件,因此许可证安全性不是一个大问题.主要目的是阻止临时用户启用他们尚未支付的功能.我会选择一个而不是设计简单!
我正在从我的一个项目中"发现不同版本之间的冲突".
如何找出哪些组件实际存在冲突?
我有两个项目A和B.项目A在项目B中使用了类型X,所以我在A中添加了B的引用.一切都很好.
我使用强大的命名密钥文件签署了项目B. 一切仍然很好.
然后我决定更改B的强命名密钥文件.我重建了项目B ok.当我尝试构建项目AI时收到错误"错误1类型X在未引用的程序集中定义.您必须添加对程序集B的引用,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 95b41b0d6571627b'. "
所以我删除了项目A中的引用并将其重新添加回来,没有任何乐趣.我可以dbl点击项目A中的项目B引用,打开对象浏览器并在那里看到类型X确定.我也完全限定了A中的X型对象,而intellisense对它们进行了很好的检测,但它仍然没有构建.
我认为更改密钥文件我可能需要更新版本,所以我将程序集B版本更改为2.0.0.0但仍抱怨它需要版本1.0.0.0.查看A中B引用的属性,它肯定指向正确的版本,实际上它显示为2.0.0.0
我可以使用现有的密钥文件但我想知道如果可能的话我会在哪里出错.
我试图在我的解决方案中使用WPF的动态数据显示库.我DynamicDataDisplay.dll在我的项目中添加了一个引用.我还在.xaml中添加了一个名称空间,如下所示:xmlns:d3="http://research.microsoft.com/DynamicDataDisplay/1.0"
当我尝试从动态数据显示库添加元素时,Intellisense没有帮助我.当我在.xaml中输入类似这样的内容时:
<d3:ChartPlotter></d3:ChartPlotter>
Run Code Online (Sandbox Code Playgroud)
Visual Studio会将其标记为错误,其中包含以下文字:
The type 'd3:ChartPlotter' was not found. Verify that you are not missing an
assembly reference and that all referenced assemblies have been built.
Run Code Online (Sandbox Code Playgroud)
但奇怪的是它仍在编译.有人可以告诉我我做错了什么吗?
下面是一个示例代码,它编译得很好,但在设计器中显示错误:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d3="http://research.microsoft.com/DynamicDataDisplay/1.0"
Title="MainWindow" Height="350" Width="525">
<Grid>
<d3:ChartPlotter></d3:ChartPlotter>
</Grid>
Run Code Online (Sandbox Code Playgroud)
编辑:
我尝试了像Merlyn Morgan-Graham建议的名称空间声明,但它仍然不起作用.发生了另一个错误
Unable to load the metadata for assembly 'DynamicDataDisplay'.
This assembly may have been downloaded from the web.
See http://go.microsoft.com/fwlink/?LinkId=179545. The following error was encountered
during load: etc.
Run Code Online (Sandbox Code Playgroud)
看起来下载的程序集需要手动解锁.这可以在Windows文件属性中完成.解除阻塞并重新启动Visual Studio后问题得以解决.
这实际上只是一个好奇心问题.我处理查看程序集和原始IL的类型.Windows 8确实在我正在实现的东西中扭曲.我发现WinRT和非WinRT框架程序集共享相同的完全限定名称.
因此,不可能客观地判断程序集是否依赖于框架程序集的WinRT或非WinRT版本(是的,可以同时使用它们).这些组件在布局和实现的类型方面有很大的不同.
为什么他们在构建WinRT程序集时不更改公钥令牌或版本号?
我在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.这不是 …
assemblies ×10
.net ×8
c# ×5
.net-4.5 ×1
asp.net-mvc ×1
binding ×1
deployment ×1
dll ×1
mono ×1
reference ×1
reflection ×1
version ×1
versioning ×1
windows-8 ×1
wpf ×1