Ich suche nach der Methode, um die Attribute einer bestehenden Methode zu aktualisieren, ohne eine neue Methodendefinition zu erstellen. HierMethodenattribute während JIT aktualisieren?
ist der Code, den ich bisher habe:
HRESULT STDMETHODCALLTYPE Weaver::JITCompilationStarted(
FunctionID functionId, BOOL fIsSafeToBlock)
{
HRESULT status = S_OK;
MethodInfo methodInfo = GetMethodInfo(functionId);
if (!IsMdVirtual(methodInfo.Attributes) && !IsMdStatic(methodInfo.Attributes)
&& !IsMdPrivate(methodInfo.Attributes) && !IsMdSpecialName(methodInfo.Attributes))
{
CComPtr<IMetaDataEmit> metaDataEmit;
status = m_profilerInfo3->GetModuleMetaData(methodInfo.Module,
ofRead | ofWrite, IID_IMetaDataEmit, (IUnknown**)&metaDataEmit);
// TODO: get module metadata and update method attributes to: methodInfo.Attributes | mdVirtual
status = metaDataEmit->ApplyEditAndContinue(metaDataEmit /*?*/);
}
return status;
}
Wie Sie sehen können, habe ich die Methoden bin fehlt die Funktion Metadaten und ändern in-line abgerufen werden. Die MSDN-Hilfe zu dieser Methode ist sehr dünn und konnte keine Beispiele für die Verwendung von ApplyEditAndContinue
finden.
Ich habe stimmen obligatorischer Kommentar für alle (oder zumindest die ersten) Downstimmen ... erspart uns Noobs herauszufinden, warum. – ilen
JITCompilationStarted ist viel zu spät, um Attribute zu ändern, die Attribute könnten überprüft werden, bevor die Methode überhaupt aufgerufen oder JIT'ed wird. Metadaten können nur über den Callback von [ModuleLoadFinished] (https://msdn.microsoft.com/en-us/library/ms230105%28v=vs.110%29.aspx) geändert werden. Warum sollten Sie ApplyEditAndContinue zum Hinzufügen von Attributen anstelle von DefineCustomAttribute verwenden? Was willst du eigentlich erreichen? (und nein, ich bin nicht derjenige, der gewählt hat) –
@BrianReichle, danke für den Heads-up, Grundsätzlich möchte ich reguläre Klassenmethoden zu virtuellen Methoden mutieren lassen, damit sie während Unit Tests verspottet werden können. Das bedeutet, dass ich ein vorhandenes Attribut ändern muss. Grundsätzlich sind nicht-virtuelle Methoden der häufigste Grund für die Schwierigkeit, unseren Legacy-Code zu testen. Und ich würde gerne vermeiden, die Assemblies auf der Festplatte zu modifizieren (zB über [Fody's] (https://github.com/Fody/Fody) [Virtuosity] (https://github.com/Fody/Virtuosity)) – ilen