标签: .net-assembly

检查DLL文件是否是C#中的CLR程序集的最佳方法

检查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)

但我喜欢在加载前检查,因为我不想要那些例外(时间).

有没有更好的办法?

c# dll .net-assembly

17
推荐指数
2
解决办法
1万
查看次数

获得依赖程序集?

有没有办法获得依赖于给定程序集的所有程序集?

伪:

Assembly a = GetAssembly();
var dependants = a.GetDependants();
Run Code Online (Sandbox Code Playgroud)

.net c# reflection .net-assembly

17
推荐指数
2
解决办法
1万
查看次数

C#.dll程序集可以包含入口点吗?

我的目标是创建一个可启动影子复制应用程序的可执行文件.诀窍是,我希望这个入门程序没有外部依赖关系,并且不必包含任何有关它必须启动的程序的知识.

我也希望它是目录中唯一的可执行文件.换句话说,我希望它"运行".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可以找到它,或者我是否只需要让自己去另一条路径?

c# assemblies appdomain .net-assembly entry-point

17
推荐指数
1
解决办法
2万
查看次数

在PCL中获取装配版本

我在.NET 4.5中有以下代码行,我试图构建为可移植类库.它的目的是获得汇编版本:

this.GetType().Assembly.GetName().Version.Major;
Run Code Online (Sandbox Code Playgroud)

问题是Assembly.GetName()在PCL中不可用.有没有办法在PCL中获得汇编版本?

我知道可以解析Assembly.FullName,但我想要一个更好的解决方案.

system.reflection .net-assembly portable-class-library

17
推荐指数
2
解决办法
6981
查看次数

Visual Studio如何知道源文件是否与原始版本匹配?

我想出了.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中引用的源文件的校验和?

c# .net-assembly visual-studio-debugging pdb-files

17
推荐指数
1
解决办法
1786
查看次数

从.Net程序集中检索目标框架版本和目标框架配置文件

在编译.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,但如果我必须采用其他方法,我会.

.net reflection .net-assembly target-framework

16
推荐指数
2
解决办法
8508
查看次数

在我的服务器中说"无法加载文件或程序集'MySql.Web ..."但我的应用程序中有mysql

    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.但还有另一种方法可以解决这个问题吗?

mysql .net-assembly

16
推荐指数
1
解决办法
5082
查看次数

哪个更适合获取程序集位置,GetAssembly().Location或GetExecutingAssembly().位置

请建议哪个是最好的执行装配位置.

Assembly.GetAssembly(typeof(NUnitTestProject.RGUnitTests)).Location
Run Code Online (Sandbox Code Playgroud)

要么

Assembly.GetExecutingAssembly().Location 
Run Code Online (Sandbox Code Playgroud)

请建议哪个更好.我GetEntryAssembly()也可以用吗?

c# .net-assembly

16
推荐指数
1
解决办法
7520
查看次数

鉴于选择,混合模式程序集与单独的互操作DLL的优缺点是什么?

当"混合模式组装"和"单独的互操作dll"版本都提供第三方组件时,每种组件的优缺点是什么?

一个很好的例子是System.Data.SQLite.

以上链接有这样的说法:

只有在出于某种原因必须将汇编二进制文件部署到全局程序集缓存的情况下,才应使用[混合模式汇编]程序包.

但为什么?混合模式程序集似乎在我的项目中工作正常,没有安装GAC(只需xcopy到应用程序的exe目录).有一个更少的DLL是很好的.这感觉整洁.那么缺点是什么?

反之亦然,为什么一个人会赞成这两个DLL"native-dll + interop-dll"版本?

.net sqlite mixed-mode interop .net-assembly

16
推荐指数
1
解决办法
528
查看次数

如何解决.NET Core软件包版本冲突

我正在从.NET MVC 5 Web应用程序迁移到.NET Core 2.2 Web API项目以及五个都放在一个解决方案下的.NET Standard 2.0项目。

我现在收到有关程序包冲突的28条警告(MSB3277),这些警告都在System名称空间内。例如,似乎是一个版本冲突System.Collections.Concurrent之间Version=4.0.11.0Version=4.0.14.0(见差错块下文)。

尝试进行故障排除:

  1. 我尝试卸载所有我不使用的,当前已2.2.300安装的.NET Core SDK 。那没有用。
  2. 我尝试在解决方案级别进入NuGet来安装缺少的程序集,但是4.0.14在选择列表中甚至不可用。我可以从以下版本的选择:4.34.0.124.0.104.0.0。我确实尝试4.3在所有项目中进行安装,但这没有用。
  3. 网路上的其他解决方案似乎要么建议使用SDK上的版本,要么在* .csproj文件中对引用进行硬编码-如果不需要,我都不喜欢这样做。我不喜欢前者,因为向后移动似乎违反直觉,而我不喜欢后者,因为硬编码是永久使用较旧软件包的修复程序,这似乎是一个坏主意,因为它不太可能会更新为要发布的较新版本。

有谁知道如何解决这些警告?任何帮助是极大的赞赏。

有关警告之一的详细构建结果:

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

16
推荐指数
1
解决办法
1401
查看次数