visual valid name example documentacion comment comentarios c# .net window hook clrprofiler

c# - valid - Perfilador CLR: problema al utilizar DefineAssemblyRef



summary documentation c# (1)

Quiero escribir un perfilador CLR para conectar nuestra función de aplicación con GetILFunctionBody/SetILFunctionBody .

Quiero usar DefineAssemblyRef para importar nuestra c # dll (para usar en el código IL) en este código DefineAssemblyRef siempre devuelve True ? ¿Mi dll tiene que ser firmado? ¿Debe instalarse en la memoria caché de ensamblados global (GAC)?

HRESULT CProfilerCallback::JITCompilationStarted ( UINT functionId, BOOL fIsSafeToBlock ) { ClassID classID; ModuleID moduleID; mdToken token; wchar_t wszClass[512]; wchar_t wszMethod[512]; HRESULT result = S_OK; ClassID classId = 0; ModuleID moduleId = 0; mdToken tkMethod = 0; // Get the moduleID and tkMethod m_pICorProfilerInfo->GetFunctionInfo(functionId, &classId, &moduleId, &tkMethod); if(!GetMethodNameFromFunctionId(functionId,wszClass,wszMethod)) {return S_FALSE;} if(wcscmp(wszMethod,L"FunctionName") == 0) { // Get the metadata import IMetaDataImport* pMetaDataImport = NULL; DebugBreak(); result = m_pICorProfilerInfo->GetModuleMetaData ( moduleId, ofRead, IID_IMetaDataImport, (IUnknown** )&pMetaDataImport ); if (FAILED(result)) { return S_FALSE;} // // Metadata modification // IMetaDataEmit* pMetaDataEmit = NULL; IMetaDataAssemblyEmit* pMetaDataAssemblyEmit = NULL; mdAssemblyRef tkLoggerLib; HRESULT res; res = m_pICorProfilerInfo->GetModuleMetaData ( moduleId, /// The ID of the module to which the interface instance will be mapped ofRead | ofWrite, IID_IMetaDataEmit, (IUnknown** )&pMetaDataEmit ); if (FAILED(res)) {DebugBreak(); return S_FALSE;} /// DebugBreak for debug res = pMetaDataEmit->QueryInterface ( IID_IMetaDataAssemblyEmit, (void**)&pMetaDataAssemblyEmit ); if (FAILED(res)) { return S_FALSE;} // Get the token for the Logger class and its Log method mdTypeDef tkLogger = 0; mdMethodDef tkLog = 0; // Create a token for the Log.dll assembly ASSEMBLYMETADATA amd; ZeroMemory(&amd, sizeof(amd)); amd.usMajorVersion = 0; amd.usMinorVersion = 0; amd.usBuildNumber = 0; amd.usRevisionNumber = 0; res= pMetaDataAssemblyEmit->DefineAssemblyRef ( NULL, 0, // No public key token L"Dllname", ///dll name &amd, NULL, 0, 0, &tkLoggerLib ); if (FAILED(res)) {return S_FALSE; } ......


Según este blog de MSDN http://blogs.msdn.com/b/davbr/archive/2006/02/27/540280.aspx :

IMetaDataAssemblyEmit: DefineAssemblyRef () le proporciona un mdAssemblyRef a su ensamblaje. Un poco de trabajo es necesario para hacer esto bien. Una forma confiable de hacer referencia a su ensamblaje es firmarlo, agregarlo al GAC y usar la clave pública que "gacutil / l" imprime para usted

También puede encontrar útil este proyecto: CLR dynamic hook injection http://www.dupuis.me/node/18 que demuestra lo que está intentando hacer.