Я пытаюсь использовать Отражение. Испустите в C# для испускания a using (x) { ... }
блок.
В точке я нахожусь в коде, я должен взять текущую вершину стека, который является объектом, который реализует IDisposable, храните это в локальной переменной, реализуйте блок использования на той переменной, и затем в нем добавляют еще некоторый код (я могу иметь дело с той последней частью.)
Вот демонстрационная часть C# кода, который я пытался скомпилировать и посмотреть на в Отражателе:
public void Test()
{
TestDisposable disposable = new TestDisposable();
using (disposable)
{
throw new Exception("Test");
}
}
Это похоже на это в Отражателе:
.method public hidebysig instance void Test() cil managed
{
.maxstack 2
.locals init (
[0] class LVK.Reflection.Tests.UsingConstructTests/TestDisposable disposable,
[1] class LVK.Reflection.Tests.UsingConstructTests/TestDisposable CS$3$0000,
[2] bool CS$4$0001)
L_0000: nop
L_0001: newobj instance void LVK.Reflection.Tests.UsingConstructTests/TestDisposable::.ctor()
L_0006: stloc.0
L_0007: ldloc.0
L_0008: stloc.1
L_0009: nop
L_000a: ldstr "Test"
L_000f: newobj instance void [mscorlib]System.Exception::.ctor(string)
L_0014: throw
L_0015: ldloc.1
L_0016: ldnull
L_0017: ceq
L_0019: stloc.2
L_001a: ldloc.2
L_001b: brtrue.s L_0024
L_001d: ldloc.1
L_001e: callvirt instance void [mscorlib]System.IDisposable::Dispose()
L_0023: nop
L_0024: endfinally
.try L_0009 to L_0015 finally handler L_0015 to L_0025
}
Я понятия не имею, как иметь дело с тот ".try..." часть в конце там при использовании Отражения. Испустить.
Кто-то может указать на меня в правильном направлении?
Править: После того, как спрошено о коде по электронной почте, я отправлю свой быстрый интерфейсный код здесь, но это не будет большим использованием никому, если Вы не захватываете некоторые мои библиотеки классов, и это - немного кода также. Код, с которым я боролся, был частью моего проекта МОК, и я должен был генерировать класс для реализации автоматического журналирования вызовов метода на сервисе, в основном класс декоратора для сервисов, который автоматически генерирует код.
Основной цикл метода, который реализует все методы интерфейса, является этим:
foreach (var method in interfaceType.GetMethods())
{
ParameterInfo[] methodParameters = method.GetParameters();
var parameters = string.Join(", ", methodParameters
.Select((p, index) => p.Name + "={" + index + "}"));
var signature = method.Name + "(" + parameters + ")";
type.ImplementInterfaceMethod(method).GetILGenerator()
// object[] temp = new object[param-count]
.variable
EmitUsing выкладывает BeginExceptionBlock, которым ответил Jon, таким образом, это - то, что я должен был знать.
Вышеупомянутый код от LoggingDecorator.cs, расширения IL находятся главным образом в ILGeneratorExtensions. Designer.cs и другие файлы в пространстве имен LVK.Reflection.
Вам нужен ILGenerator.BeginExceptionBlock
? Пример в документации показывает, что это правильный подход ...