有没有一个工具可以解释.NET程序集(可执行文件或DLL文件)的大小?
在过去,有一个IDE扩展,将详细说明项目使用的空间.
它应该显示大型代码文件:
和数据资源:
.NET世界有这样的东西吗?
我真的认为转向.NET,不再需要将整个VCL构建到可执行文件中,可执行文件的大小会缩小.
我正在Unity中使用Assembly C#开发一个项目.我尝试获得特殊字符,例如é,但在控制台中它只显示一个空白字符:"".例如翻译"你好吗?" 应该返回"CómoEstás?",但它会返回"Cmo Ests".我将返回字符串"Cmo Ests"放在一个字符数组中,并意识到它是一个非空的空白字符.我正在使用Encoding.UTF8,当我这样做时:
char ch = '\u00e9';
print (ch);
Run Code Online (Sandbox Code Playgroud)
它将打印"é".我尝试使用以下方法从给定字符串中获取字节:
byte[] utf8bytes = System.Text.Encoding.UTF8.GetBytes(temp);
Run Code Online (Sandbox Code Playgroud)
在翻译"你好吗?"时,它将返回一个字节字符串,但对于特殊字符,如é,我得到一系列字节239,191,189,这是一个替换字符.
我需要从字符中检索哪些类型的信息才能准确地确定它是什么字符?我是否需要对Google提供给我的信息做些什么,或者是其他什么?我需要一个一般情况,我可以放在我的程序中,并将适用于任何输入字符串.如果有人可以提供帮助,我们将不胜感激.
这是引用的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using System.Collections;
using System.Net;
using HtmlAgilityPack;
public class Dictionary{
string[] formatParams;
HtmlDocument doc;
string returnString;
char[] letters;
public char[] charString;
public Dictionary(){
formatParams = new string[2];
doc = new HtmlDocument();
returnString = "";
}
public string Translate(String input, String languagePair, Encoding encoding)
{
formatParams[0]= input;
formatParams[1]= languagePair;
string url = String.Format("http://www.google.com/translate_t?hl=en&ie=UTF8&text={0}&langpair={1}", …Run Code Online (Sandbox Code Playgroud) 有人可以解释如何正确制作装配信息吗?
这是我的AssemblyInfo.cs:
[assembly: AssemblyTitle("Title")]
[assembly: AssemblyDescription("Description")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Mycompany")]
[assembly: AssemblyProduct("ProductName")]
[assembly: AssemblyCopyright("Copyright ©")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(true)]
[assembly: Guid("xxxxxx-xxxxx-xxxxx")]
[assembly: AssemblyVersion("1.0")]
[assembly: AssemblyFileVersion("1.0")]
[assembly: NeutralResourcesLanguageAttribute("en")]
Run Code Online (Sandbox Code Playgroud)
这就是它在属性窗口中的显示方式:
您可以看到Description和Language与AssemblyInfo.cs中的不同.
AssemblyCompany也有问题,因为当我在ccleaner中打开启动密钥时,我的程序的公司字段为空...
我究竟做错了什么?
我有.NET程序集文件,我需要它在MATLAB中工作.(该库是用C#创建的,我有相应的源代码)
在文档之后,我发现以下命令将在MATLAB中加载程序集并使其类可用于"在MATLAB中".但它似乎没有起作用.我用它来加载文件:
color = NET.addAssembly('c:\path\to\file\EvolutionMapsClassLib.dll');
Run Code Online (Sandbox Code Playgroud)
加载很好,我在工作区中看到一个1x1 .NET程序集对象.当我输入时,color我得到以下结果:
color =
NET.Assembly handle
Package: NET
Properties for class NET.Assembly:
AssemblyHandle
Classes
Structures
Enums
GenericTypes
Interfaces
Delegates
Run Code Online (Sandbox Code Playgroud)
所以显然它已经正确加载,而且打字color.Classes提供以下内容:
>> color.Classes
ans =
'EvolutionMaps.EvolutionMap'
'EvolutionMaps.EvolutionMap+EstimationResults'
'EvolutionMaps.PrincipalDirectionEvolutionMap'
'EvolutionMaps.CharacterDimensionsEstemator'
'EvolutionMaps.MapBlob'
'EvolutionMaps.MapsMetric'
'EvolutionMaps.MapsMetric+MapMinimalComparable'
'EvolutionMaps.MapsL2Distance'
'EvolutionMaps.DiagonalEvolutionMap'
'EvolutionMaps.EvolutionMapGenerator'
'EvolutionMaps.HeightEvolutionMap'
'EvolutionMaps.FullnessEvolutionMap'
'EvolutionMaps.YvalEvolutionMap'
'EvolutionMaps.ImageExtractor'
'EvolutionMaps.HorisontalProjectionDistance'
'EvolutionMaps.StrokeWidthEvolutionMap'
'EvolutionMaps.ConnectedComponentsFinder'
'EvolutionMaps.ColorMap'
'EvolutionMaps.ColorMap+GrayColorMap'
'EvolutionMaps.ColorMap+JetColorMap'
'EvolutionMaps.TransitionAvgEvolutionMap'
'EvolutionMaps.PrincipalProjectionEvolutionMap'
'EvolutionMaps.ConnectedComponent'
'EvolutionMaps.WidthEvolutionMap'
Run Code Online (Sandbox Code Playgroud)
这似乎运作良好,但根据在线帮助,为了与这些类进行交互,我需要知道方法和属性.
这是我遇到问题的地方,既不是properties也不行methods.我尝试了每个变体来获取属性或方法列表但我不断收到此错误:
>> properties color.EvolutionMaps.ColorMap
No properties for class color.EvolutionMaps.ColorMap or no class color.EvolutionMaps.ColorMap.
>> properties color.Classes.EvolutionMaps.ColorMap …Run Code Online (Sandbox Code Playgroud) 我一直在关注这个StackOverflow问题.它是我能找到的最接近的东西,但并不完全.
让我在我的问题之前解释一下我的最终目标是什么,我正在制作一个支持web的编译器平台,因此,我想在内存中做所有事情(不做任何文件),所以我希望能够编译代码,然后能够引用我刚编译的类中的对象进行任意测试.我知道它听起来有多安全,所以欢迎提供安全方面的意见.
我的问题是如何将C#源代码编译到内存中,并创建该类的实例?
目前我正处于一个步骤,我可以生成有效的.dll并导入并在VisualStudio中手动使用它.
接下来的两个步骤是:
为了完全在记忆中尝试这个,我试过这个.(来源说明)
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 = res.CompiledAssembly;
AppDomain domain = AppDomain.CreateDomain( "thisdomain" );
domain.load( DOTasm , /*???*/ );
domain.CreateInstanceAndUnwrap( DOTasm .FullName, /*???*/ );
return /*???*/;
}
Run Code Online (Sandbox Code Playgroud)
最后,作为代码中的这一点,我希望返回一些对象,我可以调用它的属性.所以打电话 object obj = new sourceToObj(source).class(); …
我正在运行包含不同项目的解决方案.但是,我正在尝试使用Visual Studio 2015和框架4.6(在Windows 8操作系统,IIS Express上)运行包含wcf服务的项目(类库).但是它会在浏览器中不断显示此错误:
错误:
我注意到Razor 2.0的调用程序集是"System.Web.Mvc"版本4.0.0.1:
调用程序集:System.Web.Mvc,Version = 4.0.0.1,Culture = neutral,PublicKeyToken = 31bf3856ad364e35.
但是,此项目中未引用System.Web.MVC dll,项目中的引用位于下图中:
虽然它没有被引用,但它总是出现在bin文件夹中,即使我清除它.也许这就是为什么它试图调用" System.Web.WebPages.Razor "版本2.0.
澄清问题的任何线索:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>Run Code Online (Sandbox Code Playgroud)
<packages>
<package id="EntityFramework" version="6.1.3" targetFramework="net46" />
<package id="Microsoft.AspNet.Providers" version="2.0.0" targetFramework="net451" />
<package id="Microsoft.AspNet.Providers.Core" version="2.0.0" targetFramework="net451" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net46" />
<package id="PostSharp" version="4.3.5-alpha" targetFramework="net46" />
<package id="System.Web.Providers" version="1.2" targetFramework="net451" …Run Code Online (Sandbox Code Playgroud)我正在解释来自C#Windows Phone应用程序的异常报告.一种方法抛出一个NullReferenceException.方法是:
public void OnDelete(object o, EventArgs a)
{
if (MessageBox.Show(Res.IDS_AREYOUSURE, Res.IDS_APPTITLE, MessageBoxButton.OKCancel) == MessageBoxResult.OK)
m_Field.RequestDelete();
}
Run Code Online (Sandbox Code Playgroud)
它与m_Fieldnull 一致- 那里没有任何其他可能为null的东西.但这是神秘的部分.
该GetILOffset()从StackFrame从StackTrace该异常对象返回0×13.如ILDASM所示,该方法的MSIL为:
IL_0000: call string App.Res::get_IDS_AREYOUSURE()
IL_0005: call string App.Res::get_IDS_APPTITLE()
IL_000a: ldc.i4.1
IL_000b: call valuetype (...) System.Windows.MessageBox::Show(...)
IL_0010: ldc.i4.1
IL_0011: bne.un.s IL_001e
IL_0013: ldarg.0
IL_0014: ldfld class App.Class2 App.Class1::m_Field
IL_0019: callvirt instance void App.Class2::RequestDelete()
IL_001e: ret
Run Code Online (Sandbox Code Playgroud)
这是我不明白的.如果偏移确实是0x13,则意味着该ldarg行导致异常.但该命令记录为不会抛出任何异常.这callvirt应该扔,不是吗?或者相对于方法开始以外的其他方式的偏移量?ldfld也可以抛出,但仅当this对象为null时; 这在C#AFAIK中是不可能的.
文档提到调试信息可能会妨碍偏移,但它是一个发布版本.
我正在使用ILDASM检查的DLL正是我作为XAP的一部分发送到Windows Phone Store的DLL.
我的应用程序通过AppDomain.CurrentDomain.AssemblyResolve事件加载它需要的程序集.程序集是执行程序集的资源.
private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args)
{
var executingAssembly = Assembly.GetExecutingAssembly();
var assemblyName = new AssemblyName(args.Name);
var resPath = assemblyName.Name + ".dll";
using (var stream = executingAssembly.GetManifestResourceStream(resPath))
{
if (stream != null)
{
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
return Assembly.Load(buffer);
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
通常这工作正常,但正在加载的程序集包含某些控件的默认样式,这些控件将不会被应用.但是,如果我不通过Assembly.Load加载程序集,但将其保存到文件并通过Assembly.LoadFrom一切正常加载它.
那些有什么区别?为什么在直接从内存加载程序集时不起作用 - 或者为什么在首次将其保存到磁盘然后加载它时它Assembly.LoadFrom是否有效?
我很困惑,我想直接从内存加载程序集而不先保存它们.
我有一个C#项目,它直接引用了Newtonsoft.Json和其他一些引用(它间接引用了Newtonsoft.Json)。我想在所有位置将Newtonsoft.Json版本从6.0.8升级到最新的12.0.2。
最初我得到了参考程序集无法解决的问题,但是在搜索之后,我尝试将绑定放入app.config中,现在可以成功构建解决方案了:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
Run Code Online (Sandbox Code Playgroud)
我的项目如下所示:
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
<SpecificVersion>False</SpecificVersion>
<Private>True</Private>
</Reference>
Run Code Online (Sandbox Code Playgroud)
现在,问题在运行时调用库时出现,它引发以下错误:
mymethod引发了一个异常,将重试:无法加载文件或程序集“ Newtonsoft.Json,版本= 6.0.0.0,Culture =中性,PublicKeyToken = 30ad4fe6b2a6aeed”或其依赖项之一。该系统找不到指定的文件。”
使用AsmSpy,似乎间接引用是根本原因:
参考:Newtonsoft.Json,版本= 6.0.0.0,文化=中性,PublicKeyToken = 30ad4fe6b2a6aeed Newtonsoft.Json,版本= 6.0.0.0,文化=中性,PublicKeyToken = 30ad4fe6b2a6aeed来源:Microsoft.Azure.KeyVault,版本6.0.0.0 = 2.0.0.0,文化=中性,PublicKeyToken = 31bf3856ad364e35 6.0.0.0(由Microsoft.Azure.KeyVault.WebKey,版本= 2.0.0.0,文化=中性,PublicKeyToken = 31bf3856ad364e35 6.0.0.0由Microsoft.Rest.ClientRuntime,版本= 2.0 .0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35 6.0.0.0(Microsoft.Rest.ClientRuntime.Azure,版本= 3.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35
通过启用诊断项目输出,在构建时看起来不错:
2> Unified primary reference "Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed". (TaskId:19)
2> Using …Run Code Online (Sandbox Code Playgroud) 我有一个.NET Core 2.2项目A,该项目具有对程序集和.NET的程序包引用。(基本上是NuGet引用的dll)BC
我需要B和C在运行时动态加载,但我似乎无法找到我怎么可能做到这一点的任何文档。
很多文章Assembly.Load()都提到了通过调用所有引用的程序集Assembly.GetExecutingAssembly().GetReferencedAssemblies(),但是这只会检索在执行程序集的代码中明确引用了某些类型的程序集。
这对我不起作用,因为在我的代码中我没有引用它们的类型。
我发现可以通过执行a获得完整的引用程序集列表Assembly.ReflectionOnlyLoad(),但是.NET Core Runtime不支持此功能。
我试图搜索AppDomain和AssemblyLoadContext类,以查找此类信息,但找不到任何有用的信息。
综上所述,我的问题是如何动态加载程序集引用的程序集,而无需在代码中显式地触摸它们的某些类型?
.net-assembly ×10
c# ×8
.net ×4
asp.net-mvc ×1
assemblies ×1
cil ×1
dynamic ×1
json ×1
json.net ×1
matlab ×1
nuget ×1
razor-2 ×1
reflection ×1
utf-8 ×1
wcf ×1
wpf ×1