C# 从 DLL 中反射引用另一个 class
C# Reflection reference to another class from inside a DLL
我有 2 个 classes,一个是 DLL,另一个是 .cs 文件,我想从 DLL 调用 .cs 文件中的方法。
DLL
namespace SimpleDebugFormatting
{
public static class DebugLog
{
private static Type debugFormat;
private static Type DebugFormat
{
get
{
if (debugFormat == null)
return debugFormat = Assembly.GetExecutingAssembly().GetTypes().FirstOrDefault(_Type => _Type.Name.Contains("DebugFormat"));
return debugFormat;
}
}
public static List<string> GetMessages(IEnumerable _Parameters)
{
return (List<string>)DebugFormat.GetMethod("ConcatMessages", BindingFlags.Static | BindingFlags.NonPublic).Invoke(DebugFormat, new object[] { _Parameters });
}
}
}
.cs 文件
namespace SimpleDebugFormatting
{
internal static class DebugFormat
{
internal static List<string> ConcatMessages(object[] _Messages) { }
}
}
当两个 class 都是 .cs 文件时,一切正常,但是当“DebugLog”-class 是一个 DLL 时,它找不到“DebugFormat”-class.
当我尝试打印 DLL 程序集中的所有类型时
"Assembly.GetExecutingAssembly().GetTypes()",
它只显示这些 2:
SimpleDebugFormatting.DebugLog
SimpleDebugFormatting.DebugLog+<>c
为什么会这样,我怎样才能让它工作?
您的 DebugFormat
class 被标记为 internal
Internal types or members are accessible only within files in the same assembly, as in this example:
所以,您明确要求 DebugFormat
不能被 DebugLog
访问。如果您希望它易于访问,请将其设置为 public。
用这个修复它:
private static Type DebugFormat
{
get
{
if (debugFormat == null)
return debugFormat = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(
_Assembly => _Assembly.FullName.Contains("SimpleDebugFormattingAssembly")).GetTypes().FirstOrDefault(
_Type => _Type.Name.Contains("DebugFormat"));
return debugFormat;
}
}
@JonasH,@Selvin,感谢快速回复。
我有 2 个 classes,一个是 DLL,另一个是 .cs 文件,我想从 DLL 调用 .cs 文件中的方法。
DLL
namespace SimpleDebugFormatting
{
public static class DebugLog
{
private static Type debugFormat;
private static Type DebugFormat
{
get
{
if (debugFormat == null)
return debugFormat = Assembly.GetExecutingAssembly().GetTypes().FirstOrDefault(_Type => _Type.Name.Contains("DebugFormat"));
return debugFormat;
}
}
public static List<string> GetMessages(IEnumerable _Parameters)
{
return (List<string>)DebugFormat.GetMethod("ConcatMessages", BindingFlags.Static | BindingFlags.NonPublic).Invoke(DebugFormat, new object[] { _Parameters });
}
}
}
.cs 文件
namespace SimpleDebugFormatting
{
internal static class DebugFormat
{
internal static List<string> ConcatMessages(object[] _Messages) { }
}
}
当两个 class 都是 .cs 文件时,一切正常,但是当“DebugLog”-class 是一个 DLL 时,它找不到“DebugFormat”-class.
当我尝试打印 DLL 程序集中的所有类型时
"Assembly.GetExecutingAssembly().GetTypes()",
它只显示这些 2:
SimpleDebugFormatting.DebugLog
SimpleDebugFormatting.DebugLog+<>c
为什么会这样,我怎样才能让它工作?
您的 DebugFormat
class 被标记为 internal
Internal types or members are accessible only within files in the same assembly, as in this example:
所以,您明确要求 DebugFormat
不能被 DebugLog
访问。如果您希望它易于访问,请将其设置为 public。
用这个修复它:
private static Type DebugFormat
{
get
{
if (debugFormat == null)
return debugFormat = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(
_Assembly => _Assembly.FullName.Contains("SimpleDebugFormattingAssembly")).GetTypes().FirstOrDefault(
_Type => _Type.Name.Contains("DebugFormat"));
return debugFormat;
}
}
@JonasH,@Selvin,感谢快速回复。