Когда метод может быть встроен в CLR?

Я наблюдал много "интроспективного стека" кода в приложениях, которые часто неявно полагаются на их содержащие методы , а не , чтобы их правильность была встроена. Такие методы обычно включают вызовы:

  • MethodBase.GetCurrentMethod
  • Assembly.GetCallingAssembly
  • Assembly.GetExecutingAssembly

Теперь я нахожу информацию, касающуюся этих методов, очень запутанной. Я слышал, что во время выполнения не будет встроен метод, вызывающий GetCurrentMethod, но я не могу найти никакой документации по этому поводу. Я несколько раз видел сообщения на StackOverflow, такие как этот , указывающие, что CLR не выполняет встроенные вызовы кросс-сборки, но документация GetCallingAssembly категорически указывает на обратное.

Существует также сильно критикуемый [MethodImpl (MethodImplOptions.NoInlining)] , но я не уверен, считает ли это CLR быть "запросом" или "командой".

Обратите внимание, что я спрашиваю о встраивании права с точки зрения контракта, не о том, когда текущие реализации JITter отказываются рассмотреть методы из-за трудностей реализации или из-за того, когда JITter окончательно завершит выбор для встраивания подходящего метода после оценки компромиссов. Я прочитал this и this , но они, кажется, больше сосредоточены на последних двух пунктах (есть случайные упоминания MethodImpOptions.NoInlining и " В AnalyticsReceiver есть следующий код:

public void onReceive(Context ctx, Intent intent)  
/*     */   {  
/*  24 */     String referrer = intent.getStringExtra("referrer");  
/*     */  
/*  26 */     if ((!  
("com.android.vending.INSTALL_REFERRER".equals(intent.getAction())))  
|| (referrer == null))  
/*     */     {  
/*  28 */       return;  
/*     */     }  
/*     */ 
/*  31 */     String formattedReferrer = formatReferrer(referrer);  
/*     */  
/*  33 */     if (formattedReferrer != null) {  
/*  34 */       PersistentEventStore store = new  
PersistentEventStore(ctx);  
/*  35 */       store.setReferrer(formattedReferrer);  
/*  36 */       Log.d("googleanalytics", new  
StringBuilder().append("Stored   
referrer:").append(formattedReferrer).toString());  
/*     */     } else {  
/*  38 */       Log.w("googleanalytics", "Badly formatted referrer, ignored");  
/*     */     }  
/*     */   }  

Обратите внимание на две строки 36 и 38, которые регистрируют "googleanalytics". Я попытался продвинуть указанное выше приложение на рынок, загрузив его на свой Nexus One (после удаления предыдущей версии приложения) . Я создал ссылку, используя страницу Google, на которую я ссылался в начале этого сообщения

http://www.google.com/url?sa=D&q=http://market.android.com/search%3Fq % 3Dpname: com.package.app% 26referrer% 3Dutm_source% 253Dgoogle% 2526utm_medium% 253Dcpc% 2526utm_term% 253Drunning% 25252Bshoes% 2526utm_content% 253Dcontent1% 2526utm_campaign% 253gDcontent1% 2526utm_IBWqwq, загруженный из приложения IOneCBHiWR_slogin и прикреплённый к приложению IOSNFWLOKJSLoGSLog по этой ссылке, я не вижу никаких журналов из "googleanalytics" или "myapp". Остальная часть библиотеки Google Analytics работает для моего приложения. Т.е. я вижу в Google Analytics записи о посещениях страниц и т. Д. Однако все источники трафика являются «прямым трафиком». Я не понимаю, что происходит. Кто-нибудь есть хоть какое-то представление о том, что я делаю неправильно?

11
задан anticafe 27 August 2014 в 14:27
поделиться