一组类和命名空间,编译为二进制文件,使用特定于.NET的语言(如C#或VB.NET)编写。
以下代码创建一个内存类型,找到其程序集,然后尝试添加引用第一个类型的另一个类型: Add-Type -TypeDefinition '命名空间 MyNamespace { public class c {}}' $作为...
如何在 Startup.cs 中以数组形式获取 .NET 8.0 项目的所有项目引用
我有一个 ASP.NET 后端项目,其中包含几个小型类库项目作为参考。 我有一个 ASP.NET 后端项目,其中包含几个小型类库项目作为参考。 <Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS> <DockerComposeProjectPath>..\docker-compose.dcproj</DockerComposeProjectPath> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.21.0" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\src\Background\Publisher\Publisher.csproj" /> <ProjectReference Include="..\src\Common\Common.csproj" /> <ProjectReference Include="..\src\Data\Data.csproj" /> <ProjectReference Include="..\src\Identity\Identity.csproj" /> <ProjectReference Include="..\src\Transaction\Transaction.csproj" /> </ItemGroup> </Project> 我打算在ConfigureServices方法中使用汇编来注册这些类库中定义的所有服务: public static void ConfigureServices(this IServiceCollection services) { // TODO: Get all project references as an array to optimize below code. var serviceTypes = Assembly.GetExecutingAssembly().GetTypes(); var idTypes = Assembly.Load("Identity").GetTypes(); var txTypes = Assembly.Load("Transaction").GetTypes(); serviceTypes = serviceTypes.Concat(idTypes).Concat(txTypes).ToArray() .Where(t => typeof(IService).IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract) .ToArray(); foreach (var serviceType in serviceTypes) { var interfaceType = serviceType.GetInterfaces() .FirstOrDefault(i => typeof(IService).IsAssignableFrom(i)); if (interfaceType != null) { services.AddScoped(interfaceType, serviceType); } } } 以下是我正在使用的一些示例服务。 // Common library public interface IService { } // Identity library public interface IUserService : IService { } public class UserService : IUserService { } // Transaction library public interface ITransactionService : IService { } public class TransactionService : ITransactionService { } 是否可以在 ConfigureServices 的 Startup 方法中以数组形式检索所有引用的库项目? 您可以使用 Assembly.GetExecutingAssembly(); 获取当前程序集,然后使用 IService 接口查询加载的程序集并将它们添加到作用域服务中。 更多详情,您可以参考下面的例子: var currentAssembly = Assembly.GetExecutingAssembly(); var referencedAssemblies = currentAssembly.GetReferencedAssemblies() .Select(Assembly.Load) .ToList(); referencedAssemblies.Add(currentAssembly); var serviceTypes = referencedAssemblies .SelectMany(assembly => assembly.GetTypes()) .Where(type => typeof(IService).IsAssignableFrom(type) && !type.IsInterface && !type.IsAbstract) .ToList(); foreach (var serviceType in serviceTypes) { var interfaceType = serviceType.GetInterfaces() .FirstOrDefault(i => typeof(IService).IsAssignableFrom(i)); if (interfaceType != null) { builder.Services.AddScoped(interfaceType, serviceType); } } 结果:
我依稀记得我曾经看过一篇关于使用单独构建的程序集文件来改进构建时间的文章,以及关于将项目划分为多个部分的命名空间的内容......
Powershell 无法找到类型 [System.Windows.Forms.KeyEventHandler]
这可能是一个非常简单的问题,但我完全迷失了方向,寻找答案并没有帮助。 我有一些 powershell 代码来显示带有文本框的简单 GUI。 一些文字...
FileNotFoundException:无法从单元测试加载文件或程序集 CustomAssembly
我正在将 NUnit 测试项目添加到现有解决方案中。测试项目 .csproj 文件如下所示: 我正在将 NUnit 测试项目添加到现有解决方案中。测试项目 .csproj 文件如下所示: <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <IsPackable>false</IsPackable> <IsTestProject>true</IsTestProject> </PropertyGroup> <ItemGroup> <PackageReference Include="coverlet.collector" Version="6.0.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" /> <PackageReference Include="NUnit" Version="3.14.0" /> <PackageReference Include="NUnit.Analyzers" Version="3.9.0" /> <PackageReference Include="NUnit3TestAdapter" Version="4.5.0" /> </ItemGroup> <ItemGroup> <Using Include="NUnit.Framework" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\MyProject_VM\MyProject_VM.csproj" /> </ItemGroup> <ItemGroup> <Reference Include="CommonLibrary"> <HintPath>..\..\CommonLibrary\bin\Debug\CommonLibrary.dll</HintPath> <Private>True</Private> </Reference> </ItemGroup> </Project> 我希望它能够测试 MyProject_VM 上的类和方法,定义如下: <?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <ProjectGuid>{5FE6CC92-763A-4FEA-9389-BB4432C9ACEA}</ProjectGuid> <OutputType>Library</OutputType> <AppDesignerFolder>Properties</AppDesignerFolder> <RootNamespace>MyProject_VM</RootNamespace> <AssemblyName>MyProject_VM</AssemblyName> <TargetFrameworkVersion>v4.8</TargetFrameworkVersion> <FileAlignment>512</FileAlignment> <Deterministic>true</Deterministic> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <DebugSymbols>true</DebugSymbols> <DebugType>full</DebugType> <Optimize>false</Optimize> <OutputPath>bin\Debug\</OutputPath> <DefineConstants>DEBUG;TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <DebugType>pdbonly</DebugType> <Optimize>true</Optimize> <OutputPath>bin\Release\</OutputPath> <DefineConstants>TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> </PropertyGroup> <ItemGroup> <Reference Include="CommonLibrary"> <HintPath>..\..\CommonLibrary\bin\Debug\CommonLibrary.dll</HintPath> <Private>True</Private> </Reference> <Reference Include="System" /> <Reference Include="System.Configuration" /> <Reference Include="System.Data" /> </ItemGroup> <ItemGroup> <Compile Include="CoreClass.cs" /> <Compile Include="MyNeatClass.cs" /> </ItemGroup> <ItemGroup> <None Include="packages.config" /> </ItemGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> </Project> (为了简洁起见,我删除了 <Reference/> 和 <Compile/> 元素。) 到目前为止,我的测试项目只有两个类。 TestsArchitecture 进行一般设置/拆卸: using MyProject_VM; namespace TestMyProject { [SetUpFixture] public class TestsArchitecture { [OneTimeSetUp] public void SetsUpStuff() { CoreClass.Instance = new CoreClass(); } [OneTimeTearDown] public void TearsDownStuff() { // Something, at some point } } } CoreClass 使用 CommonLibrary。 并且TestMyNeatClass测试MyNeatClass中的方法: namespace TestMyProject { [TestFixture] public class TestMyNeatClass { [OneTimeSetUp] public void SetsThingsUp() { } [SetUp] public void ResetsThings() { } [Test] public void TestsMyNeatMethod() { } } } 没有做太多事情,但已经有错误了。当我运行 TestsMyNeatMethod() 时,我收到以下错误消息: OneTimeSetUp:System.IO.FileNotFoundException:无法加载文件或程序集“CommonLibrary,版本= 1.3.5.0,文化=中性,PublicKeyToken = null”。系统找不到指定的文件。 我做错了什么?我尝试将 <Private> 设置为 False,然后设置为 True,但无济于事。 在 .NET 中,您无法从 .NET Core 或 .NET 5-8 项目引用 .NET Framework 项目或程序集。当运行时尝试加载 CommonLibrary.dll 时,这种不兼容性会导致 FileNotFoundException 选项1: 更改测试项目的目标框架:将测试项目的 .csproj 文件更新为目标 .NET Framework 4.8。 选项2: 将项目升级到 .NET Standard 或 .NET 8:将 CommonLibrary 和 MyProject_VM 迁移到目标 .NET Standard 或 .NET 8,以获得现代功能和交叉兼容性。这是一个长期的解决方案,但可能需要付出巨大的努力来升级依赖项并彻底测试。
我需要在每次编译后通过向基本名称添加增量来重命名 DLL 的程序集名称。例如 1 编译:程序集名称-basename1.dll 2 编译:程序集名称-basename2.dll 编译:
什么决定了程序集何时以及是否加载到 AppDomain 中。 我想我想了解是否: 我保证所有项目引用的程序集都会 在...开始时加载
我有一个第三方程序集,我想在我的新 C# 项目中使用它的内部类。 是否可以? 任何例子都会非常感激
我有一个非常简单的aspx脚本: <%@ Page Language="C#" Debug="true" %> <%@ Assembly Name="MimeKit.dll" %> <% Response.Write("test"); %> MimeKit.dll 位于同一文件夹中...
我尝试使用以下代码获取 C# 3.0 中的执行程序集版本: var assemblyFullName = Assembly.GetExecutingAssembly().FullName; var version = assemblyFullName .Split(',')[1]...
我在 C# 中加载了一个程序集。假设以下 csproj 有一个名为 OtherPackage 的 nuget 包引用。 项目A 对版本 1.0.0 的 OtherPackage 的包引用 项目B 套餐参考...
假设我有一个包含 A 到 Z 类型的大型项目。 如果出于某种原因,我只想将类型 A 打包并分发给某些客户端怎么办? 显然我不能将 A 编译成 i...
加载插件 DLL 文件时,“动态程序集中不支持调用的成员。”
我们有自定义 DLL,但未包含在我们的初始设置文件中。 它们在运行时加载。 使用 .NET 2.0 时,此过程运行良好,但我们收到“调用的成员不是
如何获取加载到不同 AppDomain 中的 C# 程序集的内存基地址
您可以使用如下代码获取进程上加载的模块的内存基地址: ProcessModuleCollection pc = Process.GetCurrentProcess().Modules; foreach(进程模块...
我一直在尝试修复 .NET 6 控制台项目中的版本冲突。我找不到像 app.config 的 BindingRedirect 或 CodeBase 这样适用于 .NET Framework 中这种情况的方法。 有没有
我有一个类库和一个位于不同目录中的解决方案。 从 classlib 中,我调用 GetCallingAssembly,它从解决方案返回一个可执行文件,然后调用 Assembly。
如何防止调用Assembly.GetTypes()时出现ReflectionTypeLoadException
我正在尝试使用类似于以下的代码扫描程序集以查找实现特定接口的类型: 公共列表FindTypesImplementing(字符串程序集路径) { 变量匹配...
在 PowerShell 脚本中使用 AssemblyResolve 加载程序集
我有一个超级简单的.Net(框架)程序集TestAssembly.dll,其中包含命名空间Test中的公共类QuoteServer和返回字符串的静态方法GetQuote()。 我想要动态...
我正在使用 ILRepack 将 $(TargetDir)\*.dll 与 $(TargetDir)\Setup.exe 合并到子文件夹 $(TargetDir)\Merged\Setup.exe 中。合并成功,Setup.exe 运行,但我收到一些 JIT 错误
我有一个从泛型类型派生的类,如下所示: 类 MyGeneric {...} 类 MyDerivedString : MyGeneric {...} 在运行时,我的代码读取信息来创建字符串