#c# #reflection
#c# #отражение
Вопрос:
Как мне определить, является ли метод extern
, используя отражение?
Пример метода:
var mEnter = typeof(System.Threading.Monitor).GetMethod("Exit", BindingFlags.Static | BindingFlags.Public);
Комментарии:
1. Взгляните на
MethodImplAttributes
перечисление по адресуMethodInfo.MethodImplementationFlags
.
Ответ №1:
var isExtern = (mEnter.MethodImplementationFlags
amp; MethodImplAttributes.InternalCall) != 0;
Комментарии:
1. Он отлично работает для этого метода, но не для потоковой передачи. Взаимосвязанный общедоступный статический внешний объект CompareExchange (ссылка на местоположение объекта1, значение объекта, объект сравнения); Я обновлю свой вопрос
2. @animaonline отлично работает и для этого:
var method = typeof(System.Threading.Interlocked).GetMethod("CompareExchange", new[] { typeof(object).MakeByRefType(), typeof(object), typeof(object) });
3. Если вы используете
DllImportAttribute
, то метод будет отмеченPreserveSig
.4. Но, конечно! Этот метод был общим и не был помечен как extern 🙂 Спасибо за ваш ответ!
5.@animaonline действительно, существует и общая версия, которая не является
extern
Ответ №2:
Я не знаю, есть ли какой-либо прямой способ выяснить, но я могу показать трюк, который я использовал, Предположим, у нас есть класс, содержащий метод extern
class MyClass
{
[DllImport("kernel32.dll")]
public static extern bool Beep(int ferequency, int duration);
public static void gr()
{
}
public void GG()
{
}
}
мы можем получить метод проверки внешнего, написав этот код
var t = typeof(MyClass);
var l = t.GetMethods();
foreach (var item in l)
{
if (item.GetMethodBody() == null amp;amp; item.IsStatic)
{
// Method is Extern
}
}