我正在查看msdn文档,我仍然对使用LoadFile和LoadFrom加载程序集之间的区别究竟有点困惑.有人可以提供一个例子或类比来更好地描述它.MSDN文档让我更加困惑.此外,它是ReflectionOnlyLoadFrom相同的,LoadFrom只是它只在反射模式下加载程序集.
由于我的.NET经验并不是最好的,因此以下是有关使用LoadFile的MSDN文档的一些问题:
1)LoadFile检查具有相同标识但位于不同路径的程序集是什么意思?身份是什么(例子)?
2)它声明LoadFile不会将文件加载到"LoadFrom上下文"中,并且不会使用加载路径解析依赖关系.这是什么意思,有人可以提供一个例子吗?
3)最后,它声明LoadFile在这种有限的场景中很有用,因为LoadFrom无法加载具有相同身份但路径不同的程序集; 它只会加载第一个这样的组件,这再次带给我同样的问题,组件标识是什么?
例如:
void foo() {
Console.Write(__MYNAME__);
}
Run Code Online (Sandbox Code Playgroud)
打印: foo
它可以在C#中实现吗?
注意:我知道这在实践中是一个糟糕的主意; 我只是好奇CLR允许你做什么,目的是创建某种'在创建它后修改类'预处理器.
假设我有以下类,它在另一个程序集中定义,所以我无法更改它.
class Person {
public string Greet() => "Hello!";
}
Run Code Online (Sandbox Code Playgroud)
我现在定义一个接口和一个方法,如下所示:
interface IGreetable {
string Greet();
}
// ...
void PrintGreeting(IGreetable g) => Console.WriteLine(g.Greet());
Run Code Online (Sandbox Code Playgroud)
该类Person没有明确的实现IGreetable,但它可以不对其方法进行任何修改.
有了这个,有什么方法,使用Reflection,DLR或其他任何东西,其中一个实例Person可以成功传递到PrintGreeting不修改上面的任何代码?
我有一个我正在研究的C#单元测试应用程序.涉及三个程序集 - C#app本身的程序集,应用程序使用的第二个程序集,以及第二个程序集使用的第三个程序集.
所以这些电话是这样的:
First Assembly ------> Second Assembly---------> Third Assembly.
Run Code Online (Sandbox Code Playgroud)
我在第三个程序集中需要做的是获取调用第二个程序集的Fist Assembly的名称.
Assembly.GetExecutingAssembly().ManifestModule.Name
Assembly.GetCallingAssembly().ManifestModule.Name
Run Code Online (Sandbox Code Playgroud)
返回第二个程序集的名称.和
Assembly.GetEntryAssembly().ManifestModule.Name
Run Code Online (Sandbox Code Playgroud)
返回NULL
有没有人知道是否有办法获得第一届大会的集会名称?
按照其他用户的要求,我把代码放在这里.这不是100%的代码,而是遵循这样的代码.
namespace FirstAssembly{
public static xcass A
{
public static Stream OpenResource(string name)
{
return Reader.OpenResource(Assembly.GetCallingAssembly(), ".Resources." + name);
}
}
}
using FirstAssembly;
namespace SecondAssembly{
public static class B
{
public static Stream FileNameFromType(string Name)
{
return = A.OpenResource(string name);
}
}
}
Run Code Online (Sandbox Code Playgroud)
和测试项目方法
using SecondAssembly;
namespace ThirdAssembly{
public class TestC
{
[TestMethod()]
public void StremSizTest()
{
// ARRANGE
var …Run Code Online (Sandbox Code Playgroud) 我想为下面的课程编写单元测试.
如果名称不是"MyEntity",则mgr应为空白.
负单元测试
使用Manager私有访问器我想将名称更改为"Test",以便mgr应为null.然后将验证mgr值.为了实现这一点,我想显式调用静态构造函数,但是当我使用静态构造函数调用时
Manager_Accessor.name = "Test"
typeof(Manager).TypeInitializer.Invoke(null, null);
Run Code Online (Sandbox Code Playgroud)
name始终设置为"MyEntity"如何将名称设置为"Test"并调用静态构造函数.
public class Manager
{
private static string name= "MyEntity";
private static object mgr;
static Manager()
{
try
{
mgr = CreateMgr(name);
}
catch (Exception ex)
{
mgr=null;
}
}
}
Run Code Online (Sandbox Code Playgroud) 我如何获得我的财产?目前发生错误Ambiguous match found,请参阅代码中的注释行.
public class MyBaseEntity
{
public MyBaseEntity MyEntity { get; set; }
}
public class MyDerivedEntity : MyBaseEntity
{
public new MyDerivedEntity MyEntity { get; set; }
}
private static void Main(string[] args)
{
MyDerivedEntity myDE = new MyDerivedEntity();
PropertyInfo propInfoSrcObj = myDE.GetType().GetProperty("MyEntity");
//-- ERROR: Ambiguous match found
}
Run Code Online (Sandbox Code Playgroud) 在C#中,如何在运行时使用.NET Core发出新的Type?我可以在.NET 6中找到的所有示例似乎都不适用于.NET内核(它们都是从获取当前AppDomain开始的,而后者在.NET内核中不再存在).
如果可能的话,我将会感谢一个涉及创建Type并向Type添加属性的示例.
无论如何设置尚未初始化的对象上的静态(私有)变量的值?该SetValue方法需要一个实例,但我希望有办法解决这个问题.
我需要找到托管代码执行开始的程序集.
// using System.Reflection;
Assembly entryAssembly = Assembly.GetEntryAssembly();
Run Code Online (Sandbox Code Playgroud)
这似乎是要走的路,但MSDN参考页面Assembly.GetEntryAssembly说明这个方法"[c]从非托管代码调用时返回null."
在这种情况下,我想知道哪个程序集是由非托管代码调用的.
有没有可靠的方法来做到这一点,即总是返回非空Assembly引用?
在我的小项目中,我正在使用System.Reflection类来生成可执行代码.我需要调用+自定义类型的运算符.有谁知道如何使用C#反射调用自定义类的自定义运算符?
c# reflection operator-overloading operators system.reflection
c# ×9
reflection ×5
.net ×4
assemblies ×1
c#-2.0 ×1
class ×1
entry-point ×1
mstest ×1
operators ×1