在 MVC 控制器中,我用来AssemblyLoadContext.Default.LoadFromAssemblyPath(pathToDll);
加载程序集。我想在运行时删除或替换给定的 .dll 文件。这是不可能的,因为该文件没有被释放。有什么方法可以处理.dll 文件吗?有一些使用该类AppDomain
的解决方案,但在 ASP.NET Core 中不可用。
背景:用户可以上传包含给定接口实现的自定义 .dll 文件。用户还应该能够替换他的文件。我在控制器中使用以下代码来访问实现:
var conventions = new ConventionBuilder();
conventions
.ForTypesDerivedFrom<IPluginContract>()
.Export<IPluginContract>()
.Shared();
var configuration = new ContainerConfiguration().WithAssembliesInPath(path, conventions);
using (var container = configuration.CreateContainer())
{
var plugins = container.GetExports<IPluginContract>();
return plugins;
}
Run Code Online (Sandbox Code Playgroud)
和
public static ContainerConfiguration WithAssembliesInPath(
this ContainerConfiguration configuration,
string path, AttributedModelProvider conventions,
SearchOption searchOption = SearchOption.TopDirectoryOnly)
{
var fileNames = Directory
.GetFiles(path, "*.dll", searchOption);
List<Assembly> assemblies = new List<Assembly>();
foreach (string relativePath in fileNames)
{ …
Run Code Online (Sandbox Code Playgroud) 我需要在 autofac 中注册一些类型,例如 MyHandler: IRequest。这些类型驻留在程序集“A”中,到目前为止尚未引用该程序集,因此未加载到应用程序域中。我尝试使用 Assembly.LoadFile(path) 加载程序集“A”,它被加载到应用程序域中,但后来.net 运行时再次在应用程序域中加载相同的 dll,并且应用程序域中有两个“A”实例,这是我的场景中的一个问题。使用 Autofac 注册资源也无济于事。我只想知道如何防止运行时加载“A”,因为我已经加载了它。
我有 Visual Studio 2019 和一个空的.net 框架项目。我想仅通过代码构建一个 Windows 窗体项目(不使用任何模板)。
为了这个目标,我需要 System.Windows.Forms 程序集:
右键单击项目 --> 添加 --> 引用 --> COM ----> 该程序集在哪里?
ps 有一个叫做 System_windows_forms ('-' 而不是 '.')的东西,这不是我要找的。
我想创建一个具有默认权限的应用程序域,并使用默认权限将程序集加载到应用程序域中,并执行程序集内的方法.
我有一个应用程序,我需要在其中创建AppDomain和Load Assembly并执行Assembly中的方法.
这是我的代码
public class CreateAppDomain
{
public void CreateAppDom()
{
AppDomain domain = AppDomain.CreateDomain("myDomain");
domain.ExecuteAssembly(@"C:\Visual Studio 2005\Projects\A1\A1\bin\Debug\A1.dll");
domain.CreateInstanceFrom(@"C:\Visual Studio 2005\Projects\A1\A1\bin\Debug\A1.dll","A1.Navigate");
}
}
Run Code Online (Sandbox Code Playgroud)
我上面的代码是在一个名为CreateAppDomain.cs的类文件中编写的
在我的Default.aspx页面中,我创建了上面类的实例并调用了create方法.这是代码
protected void Button1_Click(object sender, EventArgs e)
{
CreateAppDomain obj = new CreateAppDomain();
obj.CreateAppDom();
Response.Write("Application Domain Successfully created");
}
Run Code Online (Sandbox Code Playgroud)
当我运行default.aspx页面时,我收到一个错误说
在程序集'A1,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'中找不到入口点.
任何人都可以向我解释上述错误的含义及其解决方案.
谢谢,
C#内部访问修饰符的定义是内部的:仅在包含程序集或朋友程序集中可访问.所以我的问题是什么是c#汇编?在包含程序集或朋友程序集中是什么意思?这是否意味着在同一命名空间或项目中?
我创建了一个程序集,为第三方供应商的控件添加其他功能(他们知道这一点,我们一起解决了许可问题).我当然没有意识到,visual studio嵌入了我的程序集在程序集的清单文件中引用的所有程序集的详细信息(在本例中为版本号).
我知道我可以打开此文件以使用Ildasm.exe查看该信息,并且对CodeProject的进一步研究表明我实际上可以继续编辑此文件.
这么简单的问题.是否可以安全地删除引用程序集的版本号信息或将它们设置为0.0.0.0,以便那些引用的程序集实际上与版本无关?
谢谢
我将在类库中使用#if DEBUG指令.已编译的ClassLibrary.dll将在单独的Application.exe中使用.
我的调试代码是否会在以下情况下执行?
我有2个组件(外国和本地).外部装配不能修改.我想扩展一个外来类,以便它现在实现一个本地接口.这可能在C#中吗?
编辑:我知道我可以做以下事情:
// foreign.dll
namespace DX {
public struct Vector3 {
...
}
}
// local.dll
namespace MyDX {
public static class Extensions {
public static void MyExtensionMethod( this Vector3 vec, int index ){
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
我感兴趣的是强制外部类/结构实现特定的接口(不使用继承).我想将Vector3用作泛型类中的类型:
public class MyGeneric<T> where T: IComparable<T> {
T _value;
}
Run Code Online (Sandbox Code Playgroud)
上面的结构:Vector3没有实现IComparable,但是我想使用反射来实现接口,这样我就可以使用现有形式的外部类/结构(即使用继承的w/o).继承可能是必要的......
我可以在这里看到CIL指令列表:
https://en.wikipedia.org/wiki/List_of_CIL_instructions
我的理解是CIL在CLR中运行.但是,我看不出这些指令如何用于发出http请求(这在CLR中显然是可能的).
这些代码似乎都不是为了获取外部信息.
我错过了什么?
.net-assembly ×10
c# ×8
.net ×3
appdomain ×3
asp.net ×2
assemblies ×2
asp.net-core ×1
autofac ×1
cil ×1
internal ×1
reflection ×1
winforms ×1