As of today, what is the right way to work with COM objects?
<p>This is a very common question and I decided to ask it because this question may have a different answer as of today. Hopefully, the answers will help to understand what is the right way to work with COM objects.
Personally, I feel very confuse after getting different opinions on this subject.</p>

<p>The last 5 years, I used to work with COM objects and the rules were very clear for me:</p>

<ol>
<li>Use a single period in lines of code. Using more than one period create temporary objects behind the scene that cannot be explictly released.</li>
<li>Do not use foreach, use a for loop instead and release each item on each iteration</li>
<li>Do not call FInalReleaseComObject, use ReleaseComObject instead.</li>
<li>Do not use GC for releasing COM objects. GC intent is mainly for debugging usage.</li>
<li>Release objects in reverse order of their creation.</li>
</ol>

<p>Some of you may be frustrated after reading those last lines, this is what I knew about how to properly create/release Com Object, I hope getting answers that will make it clearer and uncontested.</p>

<p>Following, are some links I found on this topic. Some of them telling that it is needed to call ReleaseComObject and some of them not.</p>

<ul>
<li><a href="https://www.add-in-express.com/creating-addins-blog/2013/11/05/release-excel-com-objects/" rel="noreferrer">How to properly release Excel COM objects</a> (Nov. 2013)</li>
<li><a href="http://www.codeproject.com/Tips/235230/Proper-Way-of-Releasing-COM-Objects-in-NET" rel="noreferrer">Proper Way of Releasing COM Objects in .NET</a> (Aug. 2011)</li>
<li><a href="https://blogs.msdn.microsoft.com/visualstudio/2010/03/01/marshal-releasecomobject-considered-dangerous/" rel="noreferrer">Marshal.ReleaseComObject Considered Dangerous</a> (Mar. 2010)</li>
<li><a href="https://blogs.msdn.microsoft.com/eric_carter/2004/04/07/releasecomobject/" rel="noreferrer">ReleaseCOMObject</a> (Apr. 2004)</li>
</ul>

<blockquote>
  <p>"... In VSTO scenarios, you typically don’t ever have to use ReleaseCOMObject. ..."</p>
</blockquote>

<ul>
<li>MSDN - <a href="https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject(v=vs.110).aspx" rel="noreferrer">Marshal.ReleaseComObject Method</a> (current .NET Framework version): </li>
</ul>

<blockquote>
  <p>"...You should use this method to free the underlying COM object that holds references..."</p>
</blockquote>

<p><strong>UPDATE:</strong></p>

<p>This question has been marked as too broad. As requested, I will try to simplify and ask simpler questions.</p>

<ol>
<li>Does ReleaseComObject is required when working with COM Objects or calling GC is the correct way?</li>
<li>Does VSTO approach change the way we used to work with COM Objects?</li>
<li>Which of the above rules I wrote are required and which are wrong? Is there any others?</li>
</ol>