2011-07-28 15 views
18

का उपयोग करने में समस्या मैं GetILFunctionBody/SetILFunctionBody के साथ हमारे एप्लिकेशन फ़ंक्शन को हुक करने के लिए एक सीएलआर प्रोफाइलर लिखना चाहता हूं।सीएलआर प्रोफाइलर: DefineAssemblyRef

मैं इस कोड में हमारे सी # डीएल (आईएल कोड में उपयोग के लिए) आयात करने के लिए DefineAssemblyRef का उपयोग करना चाहता हूं इस कोड में DefineAssemblyRef हमेशा True लौटाता है? क्या मेरे डीएल पर हस्ताक्षर होना है? क्या इसे ग्लोबल असेंबली कैश (जीएसी) में स्थापित करने की आवश्यकता है?

 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; } 

       ...... 
+1

मैंने वर्षों से .NET प्रोफाइलर्स में डबल्ड नहीं किया है, इसलिए मैं यहां बेस से बाहर हो सकता हूं, लेकिन आप DefineAssemblyRef को विफल होने की अपेक्षा क्यों करेंगे? आप बस एक संदर्भ घोषित कर रहे हैं - संदर्भ का उपयोग होने तक वास्तविक असेंबली का समाधान नहीं किया जाता है। आपकी असेंबली पर हस्ताक्षर नहीं होना चाहिए या जीएसी में नहीं होना चाहिए, लेकिन कॉलिंग असेंबली को इसे खोजने में सक्षम होना चाहिए, इसलिए यदि यह जीएसी में नहीं है तो उसे एक निर्देशिका में होना चाहिए जो खोज पथ पर, आईआईआरसी पर है। –

+0

वंशावली के लिए [यह लिंक] (http://www.dupuis.me/node/18) को एक उत्तर के रूप में पोस्ट किया गया था जो प्रतीत होता है कि इसे हटाया जा सकता है। लिंक में विवरण प्रश्न के लिए अत्यधिक प्रासंगिक प्रतीत होता है, हालांकि मेरे पास ज्ञान निश्चित रूप से नहीं है। – Ben

उत्तर

1

इस MSDN ब्लॉग http://blogs.msdn.com/b/davbr/archive/2006/02/27/540280.aspx के अनुसार:

IMetaDataAssemblyEmit :: DefineAssemblyRef() आप अपनी विधानसभा के लिए एक mdAssemblyRef देता है। यह अधिकार प्राप्त करने के लिए थोड़ा सा काम आवश्यक है। अपनी असेंबली का संदर्भ देने का एक विश्वसनीय तरीका है अपनी असेंबली पर हस्ताक्षर करना, इसे जीएसी में जोड़ना, और सार्वजनिक कुंजी का उपयोग करना जो "gacutil/l" आपके लिए प्रिंट करता है

आप इस परियोजना को उपयोगी भी पा सकते हैं - सीएलआर गतिशील हुक इंजेक्शन http://www.dupuis.me/node/18 उस तरह का प्रदर्शन करता है कि आप क्या करने की कोशिश कर रहे हैं।

संबंधित मुद्दे