Tag: .net assembly

获取程序集的公司名称和版权信息

我使用Assembly.GetEntryAssembly().GetName()来获取应用程序/程序集名称及其版本,但我没有看到任何公司名称和版权的变量。 我怎么做到的?

如何在DNX Core 5.0(ASP.NET 5)中引用执行程序集?

我正在移植.NET 3.5 – 4.5中的一些代码。 在我的程序集内部,我有一些代码从当前正在执行的程序集中读取资源。 但是, GetExecutingAssembly()不是DNX核心5.0中的Assembly类型的方法。 var xsdStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(xsdPath); DNX核心5.0中的Assembly.GetExecutingAssembly()相当于什么? 或者,如果我需要一个命名空间来获取该方法(也许是一个扩展方法?),那么命名空间是什么?

从程序集中公开不同的类型名称(别名)

这个问题与我之前未解决的问题有关 ,因为我仍在解决同样的问题; 这是一个不同的方法。 我目前正在C#.NET项目中使用第三方SOAP Web服务。 不幸的是,生成的客户端代理类和类成员的名称与我当前的约定不一致。 除非另有建议,否则我会假设Svcutil不支持别名( 但是,它似乎最容易在那个级别完成 ) 我现在正在考虑将Web服务消耗包装到它自己的项目中,然后组装,并简单地引用其他项目中的内容。 我正在考虑这个问题,因为可以添加一些( 可能是程序集级别的 )声明来公开具有与程序集中定义的名称不同的名称的公共类型。 我的问题是; 是否可以公开不同于程序集中定义的类型/成员名称,基本上是别名? 例如,给定一个神奇的程序集属性: [assembly: AssemblyTypeAlias( Type = typeof(Foo.Bar.qux), Name = “Qux” )] 因此,引用此程序集的项目将访问Foo.Bar.qux作为Foo.Bar.Qux 。 当然,类似的类级别属性也会很棒,因为生成的代理是partial : namespace Foo.Bar { [Alias(“Qux”)] public partial class qux { } } 产生同样的效果。 虽然我只使用我的理论示例来覆盖类型名称,但是允许成员名称别名的解决方案将是非常壮观的 。 编辑 :我已经说过“别名”,其中更适用的术语是“重命名”,以隐藏原始名称; 最好是后者,但前者会起作用。

为什么相同的类型不相等?

我正在开发一个小插件框架,并注意到我无法成功使用Type.IsAssignableFrom()来检查插件类是否实现了类型IPlugin 。 我检查了其他SO问题(比如这个) ,看看为什么函数返回false,但令我惊讶的是,没有一个建议有效。 我在插件程序PluginAPI.IPlugin有一个类,它在引用的程序PluginAPI.IPlugin实现PluginAPI.IPlugin类。 检查我的PluginAPI.IPlugin类型的AssemblyQualifiedName以及插件类的接口列表的类型时,我发现没有任何区别。 两者都超出了价值: PluginAPI.IPlugin,PluginAPI,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null 经过进一步调查,我检查了Type.cs源代码 ,发现函数IsAssignableFrom()在内部调用中失败,它检查类型是否相等(via == )。 我发现修改我的插件框架以在典型的执行上下文( Assembly.LoadFrom )中加载插件程序集而不是仅reflection上下文( Assembly.ReflectionOnlyLoadFrom )允许类型相等性检查评估为true ,这是我所期望的一直。 为什么仅reflection上下文导致类型不再相等? 码: 以下部分包含用于复制问题的相关代码以及已设置的项目说明。 程序集1:PluginAPI 该程序集仅包含IPlugin.cs: namespace PluginAPI { public interface IPlugin { } } 程序集2:Plugin1 该程序集包含几个插件(实现PluginAPI.IPlugin类)。 namespace Plugin1 { public class MyPlugin : IPlugin { public MyPlugin() { } } } […]

.NET相当于静态库?

我正在托管代码(主要是C ++ / CLI)中构建一个工具,有两个版本,一个是“普通用户”版本,另一个是“专业版”。 核心代码在两个版本之间是相同的这一事实导致我有点麻烦,因为我想将生成的工具打包为单个程序集(DLL),我不希望必须包含公共的.cpp文件两个版本工具的项目代码。 我宁愿有一个公共代码项目和每个工具版本的项目,并且每个版本的工具项目都依赖于公共代码并根据需要链接它。 在非托管C ++中,我通过将公共代码放在静态库中并将工具的两个版本链接到它来实现这一点。 我似乎无法在C ++ / CLI中使用它。 似乎我被迫将公共代码构建到DLL程序集中,这导致了比我想要的更多的DLL。 因此,总而言之,我无法弄清楚如何在一个项目中构建公共代码并将其与每个最终产品项目链接以生成两个包含公共代码的单个DLL程序集。 我可能做错了但是我试图用netmodules和其他方法来解决这个问题,但是我无法让它工作。 最后,我让它工作的唯一方法是告诉链接器链接公共代码程序集的构建产品而不是有效的结果但是有点像黑客恕我直言。 无论如何,有没有人对我应该如何解决这个问题有任何建议? 编辑:我想我应该提到这样一个事实,即生成的程序集不是100%托管代码,它们包含托管代码和非托管代码的混合,可能在使用C ++ / CLI生成的程序集中非常常见…

确定assembly的装载上下文

给定一个加载的Assembly有一种方法(在代码中)来确定它加载到的3个加载上下文中的哪一个(默认的Load , LoadFrom或Neither )? 在Suzanne Cook的“选择绑定上下文”一文中,将程序集加载到LoadFrom时会出现一些缺点。 特别是,我的库使用反序列化并在加载到LoadFrom上下文时遇到InvalidCastException 。 目前我的库失败很晚(它在执行有问题的反序列化代码时失败 – 请参阅我的示例 )。 我想通过检测它加载到的上下文并在未加载到默认Load上下文时抛出exception,使它在这些情况下更早失败。

从构建输出中省略本地化版本的程序集

在我的一个项目中,我正在使用一个名为Humanizer的很棒的库。 这个库有很多语言版本(我算38)。 当我构建我的项目时,然后我看到所有这些文件夹,如“af”,“ar”,“bg”,“bn-BD”,…,“zh-Hant”,其中的程序集包含此库的本地化资源。 我的问题是我的项目仅限英语,我没有兴趣在我的构建输出中拥有所有这些本地化程序集。 是否有一些从构建中省略它们的好方法? 我正在寻找这个问题的一般解决方案。 它发生在除Humanizer之外的库,如DevExpress Controls等,它们不是开源的。

加载程序集时依赖于另一个域的FileNotFound

我正在尝试使用插件进行应用程序。 我有MainLib.dll,我用1方法制作了一些commnon接口(让它是ICommon )。 然后,我制作了2个.dll(插件),它们引用了MainLib.dll并在某些类中实现了ICommon 。 此外,我删除了此.dlls exept System所有引用。 然后,我创建了一个应用程序,它监视文件夹”.\\Plugins”并加载newDomain所有.dll,检查.dll中的类型是否实现了ICommon (因此该应用程序也引用了MainLib.dll)。 如果是 – 在某些列表中添加.dll的名称。 现在问题出现了 :在我尝试加载插件之前 – 我将MailLib.dll和System加载到newDomain,因为所有插件都依赖于这个.dll。 他们加载正确。 然后,我开始加载插件,在这里我有: FileNotFoundException,无法加载文件或程序集’PluginWithException,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null’或其依赖项之一。 系统找不到指定的文件。)字符串上的程序集loadedAssembly = domain.Load(Assembly.LoadFrom(asm).FullName); PluginWithException程序集只有2个依赖项–System和MainLib。 在我尝试加载PluginWithException之前,我检查了新域中的程序集,System和MainLib已加载到此域。 所以我看不到任何依赖的问题。 我阅读了这个主题,并ProxyDomain使用ProxyDomain解决方案,但exception是相同的。 我做错了什么? 这里的代码: public static List SearchPlugins(string[] names) { AppDomain domain = AppDomain.CreateDomain(“tmpDomain”); domain.Load(Assembly.LoadFrom(@”.\MainLib.dll”).FullName); domain.Load(@”System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089″); MessageBox.Show(GetAssembies(domain)); // here I can […]

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#CompilerResults GenerateInMemory?

我一直在关注这个StackOverflow问题 。 它是我能找到的最接近的东西,但并不完全。 让我解释一下我的最终目标是在我的问题之前,我正在制作一个支持web的编译器平台,因此,我想在内存中做所有事情( 不做任何文件 ),所以我希望能够编译代码,然后能够引用我刚刚编译的类中的对象进行任意测试。 我知道它听起来有多安全,所以欢迎提供安全方面的意见。 我的问题是如何将C#源代码编译到内存中,并创建该类的实例? 目前我正处于一个步骤,我可以生成有效的.dll并导入并在VisualStudio中手动使用它。 接下来的两个步骤是: 自动加载程序集( 这就是我在这里要求的 ) 这意味着我不再需要为dll提供路径,并手动获取封闭类的成员 任意引用它的成员 这意味着我可以创建一个类的接口,而无需其成员的先验知识,有点像foreach循环如何在键值对上工作。 为了完全在记忆中尝试这个,我试过这个。 (来源然后解释) private object sourceToObj(string source) { string source = “…”; /*my class*/ CSharpCodeProvider pro = new CSharpCodeProvider(); CompilerParameters params = new CompilerParameters(); params.GenerateInMemory = true; params.GenerateExecutable = false; params.ReferencedAssemblies.Add(“System.dll”); CompilerResults res = pro.CompileAssemblyFromSource( params, source ); Assembly DOTasm […]