检查DLL文件是Win32 DLL还是CLR程序集的最佳方法是什么?目前我使用此代码
try
{
this.currentWorkingDirectory = Path.GetDirectoryName(assemblyPath);
//Try to load the assembly.
assembly = Assembly.LoadFile(assemblyPath);
return assembly != null;
}
catch (FileLoadException ex)
{
exception = ex;
}
catch (BadImageFormatException ex)
{
exception = ex;
}
catch (ArgumentException ex)
{
exception = ex;
}
catch (Exception ex)
{
exception = ex;
}
if (exception is BadImageFormatException)
{
return false;
}
Run Code Online (Sandbox Code Playgroud)
但我喜欢在加载前检查,因为我不想要那些例外(时间).
有没有更好的办法?
有没有办法获得依赖于给定程序集的所有程序集?
伪:
Assembly a = GetAssembly();
var dependants = a.GetDependants();
Run Code Online (Sandbox Code Playgroud) 我的目标是创建一个可启动影子复制应用程序的可执行文件.诀窍是,我希望这个入门程序没有外部依赖关系,并且不必包含任何有关它必须启动的程序的知识.
我也希望它是目录中唯一的可执行文件.换句话说,我希望它"运行".dll程序集而不是.exe程序集.(我可以要求每次加载到新AppDomain中的.dll文件的名称都是相同的,比如Main.dll或类似的东西.)
它看起来像AppDomain.ExecuteAssembly将完全按照我的意愿行事.它表示它将在".NET Framework标头中指定的入口点"开始执行.
当我尝试使用该功能时,我收到错误"在程序集中找不到入口点'DllApp'".
我有启动程序,只是试图运行程序集:
static void Main()
{
AppDomain domain = AppDomain.CreateDomain( "DllApp" );
domain.ExecuteAssembly( "DllApp.dll" );
}
Run Code Online (Sandbox Code Playgroud)
应用程序代码,在.dll文件中,带有默认入口点:
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault( false );
Application.Run( new Form1() );
}
}
Run Code Online (Sandbox Code Playgroud)
Main()函数的这个页面说"库和服务不需要Main方法作为入口点".它并没有说它们也没有默认入口点.
我已经尝试了public/private static void main的所有各种排列,int返回类型,string [] args作为参数,带有命名空间,没有命名空间,静态/非静态类等.
我能够将我的代码更改为继承MarshalByRefObject,然后使用CreateInstance创建一个对象,但这似乎会将启动器更紧密地耦合到它应该启动的程序.如果我可以使用ExecuteAssembly,那么正在启动的应用程序只需要一个静态的void Main,这非常简单而且很难搞乱.
.dll程序集是否有可能具有默认入口点,并且ExecuteAssembly可以找到它,或者我是否只需要让自己去另一条路径?
我在.NET 4.5中有以下代码行,我试图构建为可移植类库.它的目的是获得汇编版本:
this.GetType().Assembly.GetName().Version.Major;
Run Code Online (Sandbox Code Playgroud)
问题是Assembly.GetName()在PCL中不可用.有没有办法在PCL中获得汇编版本?
我知道可以解析Assembly.FullName,但我想要一个更好的解决方案.
我想出了.NET程序集.dll文件如何使用GUID(博客)映射到.pdb .当我调试到一个程序集并询问源代码时,如果我导航到一个文件,它可能会告诉我源代码与原始代码不同.怎么知道这个?我期望.pdb文件包含每个文件的校验和,但它似乎没有.我发现转储调试信息的最佳工具是dia2dump.C++ .pdb文件有MD5条目,但C#.pdb文件没有.
C++ dump
dia2dump -f dia2dump.pdb> dia2dump.pdb.files.txt
C#dump
dia2dump -f Autofac.pdb> Autofac.pdb.files.txt
dia2dump -all Autofac.pdb> Autofac.pdb.all.txt
我在"全部"转储中错过了什么?
它必须使用校验和.如果我在Module.cs中更改单个字符,我会得到:

在哪里可以找到.pdb中引用的源文件的校验和?
在编译.Net程序集时,有什么方法可以访问用于TargetFrameworkVersion和/或TargetFrameworkProfile的值吗?
我正在谈论的值是包含项目文件的值
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<OtherStuff>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>Client</TargetFrameworkProfile>
<OtherStuff>
</PropertyGroup>
<OtherStuff>
</OtherStuff>
</Project>
Run Code Online (Sandbox Code Playgroud)
基本上我想知道编译程序集时框架的目标版本是什么,以及可能的目标框架配置文件.
我不是在谈论当前加载的CLR版本,Environment.Version不是我想要的.
理想情况下,解决方案将使用System.Reflection,但如果我必须采用其他方法,我会.
Parser Error Message: Could not load file or assembly 'MySql.Web, Version=6.7.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d' or one of its dependencies. The system cannot find the file specified.
...
Line 240: <providers>
Line 241: <add name="MySQLMembershipProvider" type="MySql.Web.Security.MySQLMembershipProvider, MySql.Web, Version=6.7.4.0,
.....
Run Code Online (Sandbox Code Playgroud)
解决了将标记放在web.config文件中的以下行:
<remove name="MySQLMembershipProvider"/>
Run Code Online (Sandbox Code Playgroud)
我没有访问服务器设置来删除mysql.但还有另一种方法可以解决这个问题吗?
请建议哪个是最好的执行装配位置.
Assembly.GetAssembly(typeof(NUnitTestProject.RGUnitTests)).Location
Run Code Online (Sandbox Code Playgroud)
要么
Assembly.GetExecutingAssembly().Location
Run Code Online (Sandbox Code Playgroud)
请建议哪个更好.我GetEntryAssembly()也可以用吗?
当"混合模式组装"和"单独的互操作dll"版本都提供第三方组件时,每种组件的优缺点是什么?
一个很好的例子是System.Data.SQLite.
以上链接有这样的说法:
只有在出于某种原因必须将汇编二进制文件部署到全局程序集缓存的情况下,才应使用[混合模式汇编]程序包.
但为什么?混合模式程序集似乎在我的项目中工作正常,没有安装GAC(只需xcopy到应用程序的exe目录).有一个更少的DLL是很好的.这感觉整洁.那么缺点是什么?
反之亦然,为什么一个人会赞成这两个DLL"native-dll + interop-dll"版本?
我正在从.NET MVC 5 Web应用程序迁移到.NET Core 2.2 Web API项目以及五个都放在一个解决方案下的.NET Standard 2.0项目。
我现在收到有关程序包冲突的28条警告(MSB3277),这些警告都在System名称空间内。例如,似乎是一个版本冲突System.Collections.Concurrent之间Version=4.0.11.0和Version=4.0.14.0(见差错块下文)。
尝试进行故障排除:
2.2.300安装的.NET Core SDK 。那没有用。4.0.14在选择列表中甚至不可用。我可以从以下版本的选择:4.3,4.0.12,4.0.10和4.0.0。我确实尝试4.3在所有项目中进行安装,但这没有用。有谁知道如何解决这些警告?任何帮助是极大的赞赏。
有关警告之一的详细构建结果:
Line 5419: 3> Dependency "System.Collections.Concurrent, Version=4.0.14.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
Line 5420: 3> Could not resolve this reference. Could not locate the assembly "System.Collections.Concurrent, Version=4.0.14.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". Check to make sure the assembly exists on disk. If this reference …Run Code Online (Sandbox Code Playgroud) c# conflicting-libraries .net-assembly visual-studio asp.net-core
.net-assembly ×10
c# ×6
.net ×3
reflection ×2
appdomain ×1
asp.net-core ×1
assemblies ×1
dll ×1
entry-point ×1
interop ×1
mixed-mode ×1
mysql ×1
pdb-files ×1
sqlite ×1