<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.atalasoft.com/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Rick Minerich's Development Wonderland : VB.NET</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/tags/VB.NET/default.aspx</link><description>Tags: VB.NET</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>F# Discoveries This Week 11/22/2009</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2009/11/22/discoveries-this-week-11-22-2009.aspx</link><pubDate>Sun, 22 Nov 2009 23:49:52 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:19754</guid><dc:creator>RickM</dc:creator><slash:comments>2</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/19754.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=19754</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=19754</wfw:comment><description>&lt;p&gt;Over this past week at PDC I was lucky enough to see some fantastic sessions and spend time with members of the F# and greater Visual Studio language teams.&amp;#160; Naturally, these experiences have left me both floored and swimming in new ideas.&amp;#160; This edition of Discoveries This Week includes both the very best of what I saw at PDC 2009 and the most outstanding things I’ve glimpsed going on in the F# community.&amp;#160; Please do enjoy.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Reflection on the PDC Keynotes&lt;/h3&gt;  &lt;p&gt;For the most information in the shortest amount of time I suggest watching the &lt;a href="http://microsoftpdc.com/Sessions/KEY01"&gt;day one&lt;/a&gt; and &lt;a href="http://microsoftpdc.com/Sessions/KEY02"&gt;day two&lt;/a&gt; PDC keynotes.&amp;#160; They are both jam packed with exciting announcements and demos.&amp;#160; While at PDC I wrote about my experience watching these &lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2009/11/17/surprises-in-the-pdc09-keynote-open-source-open-platforms-and-the-democratization-of-data.aspx"&gt;here&lt;/a&gt; (day one) and &lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2009/11/18/pdc09-keynote-day-2-silverlight-4-0-and-free-laptops.aspx"&gt;here&lt;/a&gt; (day two).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;&lt;a href="http://microsoftpdc.com/Sessions/FT52"&gt;Microsoft Perspectives on the Future of Programming&lt;/a&gt;&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Come hear from several of the Microsoft senior technical leaders about the future of programming, programming languages, and tools.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;If you watch just one PDC session let this be it.&amp;#160; &lt;/p&gt;  &lt;p&gt;With Butler Lampson, Erik Meijer, Don Box, Jeffrey Snover, Herb Sutter, and Burton Smith, Microsoft’s best gathered to debate the future of programming in a twitter driven panel at PDC.&amp;#160; I was happy to be able to contribute with a question on type systems which erupted into quite a disagreement.&amp;#160; I will be writing about this session at length, and reflecting on my &lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/15/anders-hejlsberg-on-the-future-of-programming-languages.aspx"&gt;past thoughts about this topic&lt;/a&gt;, in the near future.&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Luke Hoban’s &lt;a href="http://microsoftpdc.com/Sessions/FT20"&gt;F# for Parallel and Asynchronous Programming&lt;/a&gt;&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;F#, a functional and object-oriented language for Microsoft .NET, adds many tools to make parallel and asynchronous programming both fun and easy. Come hear the core concepts of the F# language, and see how ideas like immutability, functional design, async workflows, agents, and more can be used to meet the challenges of today’s real-world applications.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;By combining small, easily understood, ideas Luke constructs F#’s big picture in the most engaging way I’ve seen to date.&amp;#160; This is now my go to talk for people who are interested in, but new to, the F# programming language.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Jomo Fisher’s &lt;a href="http://blogs.msdn.com/jomo_fisher/archive/2009/11/17/f-scripting-net-4-0-and-mixed-mode-assemblies.aspx"&gt;F# Scripting, .NET 4.0 and Mixed-mode assemblies&lt;/a&gt;&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;One of the recent problems we’ve seen is that, because of the support for side-by-side runtimes, .NET 4.0 has changed the way that it binds to older mixed-mode assemblies. These assemblies are, for example, those that are compiled from C++\CLI. Currently available DirectX assemblies are mixed mode.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This clever approach to switching the F# REPL to 2.0 binding mode is particularly handy to know.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Matthew Moloney’s &lt;a href="http://www.mattssoftwareblog.com/?p=212"&gt;Collaborative Development Using F# Interactive&lt;/a&gt;&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;This is a proof of concept of an interactive collaborative development environment I built using&amp;#160; F# Interactive. The aim here is to explore different ideas for further development, not so much as to present an alternative to Visual Studio.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I couldn’t pass this very cool idea up.&amp;#160; I can’t help but think about extending this to full feldged explorative programming community websites.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Bart Czernicki’s &lt;a href="http://silverlighthack.com/post/2009/11/04/Silverlight-3-and-FSharp-Support-in-Visual-Studio-2010.aspx"&gt;Silverlight 3 and F# Support in Visual Studio 2010&lt;/a&gt;&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;The goal of this blog post is to make you aware of F# support in Silverlight in Visual Studio 2010.&amp;#160; In addition, this blog post shows an example why F# is going to be very important for Silverlight architects and developers.&amp;#160; Note:&amp;#160; This is NOT an intro to F#.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;A great post.&amp;#160; I am always interested in seeing concrete examples of F# adding value to existing technologies and platforms.&amp;#160; I have a sneaking suspicion that there are very few places where it won’t.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/rickm/archive/2009/11/22/discoveries-this-week-11-22-2009.aspx&amp;amp;;subject=F%23+Discoveries+This+Week+11%2f22%2f2009" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/11/22/discoveries-this-week-11-22-2009.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/11/22/discoveries-this-week-11-22-2009.aspx&amp;amp;;title=F%23+Discoveries+This+Week+11%2f22%2f2009" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/11/22/discoveries-this-week-11-22-2009.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/11/22/discoveries-this-week-11-22-2009.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/11/22/discoveries-this-week-11-22-2009.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/11/22/discoveries-this-week-11-22-2009.aspx&amp;amp;title=F%23+Discoveries+This+Week+11%2f22%2f2009" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/11/22/discoveries-this-week-11-22-2009.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/11/22/discoveries-this-week-11-22-2009.aspx&amp;amp;;title=F%23+Discoveries+This+Week+11%2f22%2f2009" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/11/22/discoveries-this-week-11-22-2009.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/11/22/discoveries-this-week-11-22-2009.aspx&amp;amp;;title=F%23+Discoveries+This+Week+11%2f22%2f2009&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/11/22/discoveries-this-week-11-22-2009.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=19754" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/F_2300_/default.aspx">F#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/fsharp/default.aspx">fsharp</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/languages/default.aspx">languages</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/roundup/default.aspx">roundup</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET+4.0/default.aspx">.NET 4.0</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/silverlight/default.aspx">silverlight</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/PDC09/default.aspx">PDC09</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/pdc/default.aspx">pdc</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/REPL/default.aspx">REPL</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/Silverlight+3.0/default.aspx">Silverlight 3.0</category></item><item><title>.NET 2.0 ActiveX Control Gotchas (Safe for Scripting and Hooking into Events)</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2009/06/03/net-2-0-activex-control-gotchas-safe-for-scripting-and-hooking-into-events.aspx</link><pubDate>Wed, 03 Jun 2009 17:41:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:18569</guid><dc:creator>RickM</dc:creator><slash:comments>6</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/18569.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=18569</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=18569</wfw:comment><description>&lt;p&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/image_734E1359.png"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I’ve recently been building an ActiveX Control in .NET 2.0 and thought I would share some of the problems I’ve run into, as well as their solutions.&amp;#160; I hope that in reading this you can avoid a few of the timesinks I fell into.&amp;#160; &lt;/p&gt;  &lt;h2&gt;&amp;#160;&lt;/h2&gt;  &lt;h2&gt;&lt;font size="4"&gt;Safe for Scripting&lt;/font&gt;&lt;/h2&gt;  &lt;p&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/image_1B82DD1D.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://www.atalasoft.com/cs/blogs/rickm/image_thumb_76851CA3.png" width="478" height="59" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;By default, ActiveX controls are not marked as safe for scripting.&amp;#160; This means that Internet Explorer will refuse to run a control given it’s default settings, even for sites in it’s Trusted security zone.&amp;#160; Thankfully, this is an easy problem to correct.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;&lt;font size="3"&gt;The Wrong Way&lt;/font&gt;&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/image_26AEF818.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://www.atalasoft.com/cs/blogs/rickm/image_thumb_0CDAC1E9.png" width="404" height="75" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;It’s possible to hide this issue on the client machine by setting “Initialize and script ActiveX controls not marked safe for scripting.” to true or prompt.&amp;#160; This, of course, is not an acceptable solution as it will require all clients to do the same and in so doing potentially open them to malicious controls.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;&lt;font size="3"&gt;The Correct Solution&lt;/font&gt;&lt;/h3&gt;  &lt;p&gt;There are two ways to mark an ActiveX control as safe for scripting.&amp;#160; The first, and easiest in the context of .NET, is to &lt;a href="http://blog.devstone.com/aaron/archive/2007/06/12/2409.aspx"&gt;implement the IObjectSafety interface&lt;/a&gt;.&amp;#160; The only caveat to this method is that it requires that you can modify the ActiveX control’s source code.&amp;#160; &lt;/p&gt;  &lt;p&gt;The second, more complex option, is to use COM Component Categories Manager.&amp;#160; While not requiring source changes and recompilation, this method requires a rather large amount of registry editing.&amp;#160; As I did not take this approach, I won’t delve into it further.&amp;#160; Additional .NET implementation information is available in &lt;a href="http://www.codeproject.com/KB/COM/RobinComCat.aspx"&gt;this CodeProject article&lt;/a&gt;.&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;IObjectSafety&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Implementation requires first importing the IObjectSafety interface.&amp;#160; This is a simply a matter of declaring a interface with the ComImport attribute. &lt;/p&gt;  &lt;p&gt;While in most cases it is extremely important to ensure the Guid tags on your interface declarations are unique, in this case it equally important not to change it.&amp;#160; This is because the GUID attribute here is that of the IObjectSafety interface.&amp;#160; To put it plainly, &lt;strong&gt;changing the Guid in the following example will cause it to not work&lt;/strong&gt;.&lt;/p&gt;  &lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:480px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  1: [Flags]
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  2: &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;enum&lt;/span&gt; IObjectSafetyOpts : &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; &lt;span style="color:#008000;"&gt;//DWORD&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  3: {
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  4:     &lt;span style="color:#008000;"&gt;// Object is safe for untrusted callers.&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  5:     INTERFACESAFE_FOR_UNTRUSTED_CALLER  = 0x00000001,
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  6:     &lt;span style="color:#008000;"&gt;// Object is safe for untrusted data.&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  7:     INTERFACESAFE_FOR_UNTRUSTED_DATA    = 0x00000002,
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  8:     &lt;span style="color:#008000;"&gt;// Object uses IDispatchEx.&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  9:     INTERFACE_USES_DISPEX               = 0x00000004,
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 10:     &lt;span style="color:#008000;"&gt;// Object uses IInternetHostSecurityManager.&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 11:     INTERFACE_USES_SECURITY_MANAGER     = 0x00000008
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 12: }
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 13: 
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 14: &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;enum&lt;/span&gt; IObjectSafetyRetVals : &lt;span style="color:#0000ff;"&gt;uint&lt;/span&gt; &lt;span style="color:#008000;"&gt;//HRESULT&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 15: {
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 16:     &lt;span style="color:#008000;"&gt;//The object is safe for loading.&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 17:     S_OK            = 0x0,
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 18:     &lt;span style="color:#008000;"&gt;//The riid parameter specifies an interface that is unknown to the object.&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 19:     E_NOINTERFACE   = 0x80000004
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 20: }
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 21: 
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 22: [ComImport()]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 23: &lt;span style="color:#008000;"&gt;//This GUID is that of IObjectSafety. Do not replace!&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 24: [Guid(&amp;quot;&lt;span style="color:#8b0000;"&gt;CB5BDC81-93C1-11CF-8F20-00805F2CD064&lt;/span&gt;&amp;quot;)] 
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 25: [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 26: &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt; IObjectSafety
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 27: {
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 28:     [PreserveSig()]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 29:     IObjectSafetyRetVals GetInterfaceSafetyOptions(&lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; Guid riid, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; IObjectSafetyOpts supportedOpts, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; IObjectSafetyOpts enabledOpts);
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 30:     [PreserveSig()]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 31:     IObjectSafetyRetVals SetInterfaceSafetyOptions(&lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; Guid riid, IObjectSafetyOpts optsMask, IObjectSafetyOpts enabledOpts);
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 32: }
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 33: &lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;You then need only implement this interface in your ActiveX control as follows.&lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:480px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  1: ...
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  2: &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; partial &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; ExampleControl : IObjectSafety
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  3: {
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  4:     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IObjectSafetyRetVals GetInterfaceSafetyOptions(&lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; Guid riid, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; IObjectSafetyOpts supportedOpts, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; IObjectSafetyOpts enabledOpts)
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  5:     {
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  6:         supportedOpts = IObjectSafetyOpts.INTERFACESAFE_FOR_UNTRUSTED_CALLER | IObjectSafetyOpts.INTERFACESAFE_FOR_UNTRUSTED_DATA;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  7:         enabledOpts = IObjectSafetyOpts.INTERFACESAFE_FOR_UNTRUSTED_CALLER | IObjectSafetyOpts.INTERFACESAFE_FOR_UNTRUSTED_DATA;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  8:         &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; IObjectSafetyRetVals.S_OK;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  9:     }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 10: 
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 11:     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IObjectSafetyRetVals SetInterfaceSafetyOptions(&lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; Guid riid, IObjectSafetyOpts optsMask, IObjectSafetyOpts enabledOpts)
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 12:     {
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 13:         &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; IObjectSafetyRetVals.S_OK;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 14:     }
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 15:     ...
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 16: }
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 17: &lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;With the IObjectSafety interface implemented to return INTERFACESAFE_FOR_UNTRUSTED_CALLER and INTERFACESAFE_FOR_UNTRUSTED_DATA, your object is considered scripting safe for use by Internet Explorer.&amp;#160; Your control should no longer require any non-default ActiveX related settings to run.&lt;/p&gt;

&lt;p&gt;INTERFACE_USES_DISPEX and INTERFACE_USES_SECURITY_MANAGER are mainly used for scripting engines and can be safely ignored.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h2&gt;&lt;font size="4"&gt;Hooking into Events&lt;/font&gt;&lt;/h2&gt;

&lt;p&gt;Working on my current project, I spent a not insignificant amount of time working to make events fire correctly.&amp;#160; I started with a simple implementation, similar to what is discussed in &lt;a href="http://www.codeproject.com/KB/cs/CreateActiveXDotNet.aspx"&gt;this article&lt;/a&gt;. &lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:480px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  1: &amp;lt;object id=&amp;quot;&lt;span style="color:#8b0000;"&gt;ActiveXExample&lt;/span&gt;&amp;quot; &lt;span style="color:#0000ff;"&gt;name&lt;/span&gt;=&amp;quot;&lt;span style="color:#8b0000;"&gt;ActiveXExample&lt;/span&gt;&amp;quot; 
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  2:   classid=&amp;quot;&lt;span style="color:#8b0000;"&gt;clsid:21192EDE-868C-4b94-9D20-B822C42EA9D2&lt;/span&gt;&amp;quot; 
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  3:   codebase=&amp;quot;&lt;span style="color:#8b0000;"&gt;ActiveX.cab#version=1,0,0,0&lt;/span&gt;&amp;quot; VIEWASTEXT&amp;gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  4: &amp;lt;/object&amp;gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:480px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  1: [Guid(&amp;quot;&lt;span style="color:#8b0000;"&gt;C07F993D-242D-4c1e-AF1B-B77CAE5FD088&lt;/span&gt;&amp;quot;)]
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  2: [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  3: &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt; IExposedComEvents
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  4: {
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  5:     [DispIdAttribute(0x60020001)]
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  6:     &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; ExampleEvent(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; text);
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  7: }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  8: 
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  9: [Guid(&amp;quot;&lt;span style="color:#8b0000;"&gt;21192EDE-868C-4b94-9D20-B822C42EA9D2&lt;/span&gt;&amp;quot;)]
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 10: [ClassInterface(ClassInterfaceType.None),
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 11:  ComSourceInterfaces(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(IExposedComEvents))]
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 12: [ComVisible(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 13: &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; partial &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; ActiveXExample
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 14: {
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 15:     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;event&lt;/span&gt; ExampleEventHandler ExampleEvent;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 16:     ...
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 17: }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 18: &lt;/pre&gt;&lt;/pre&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:480px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  1: &amp;lt;script language=&amp;quot;&lt;span style="color:#8b0000;"&gt;javascript&lt;/span&gt;&amp;quot;&amp;gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  2: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; ActiveXExample::ExampleEvent(text)
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  3:     &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt; {
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  4:         elem = &lt;span style="color:#0000ff;"&gt;document&lt;/span&gt;.getElementById(&amp;quot;&lt;span style="color:#8b0000;"&gt;status&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  5:         elem.innerHTML = text;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  6:     } &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt;(exception) {
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  7:         &lt;span style="color:#0000ff;"&gt;alert&lt;/span&gt;(&amp;quot;&lt;span style="color:#8b0000;"&gt;Exception Thrown in Event: &lt;/span&gt;&amp;quot; + exception);
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  8:     }
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  9: &amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;However, I found that my javascript events were not being registered.&amp;#160; After some fiddling, I discovered that I was able to capture the event by instead using the “for-object event” script tag. &lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:480px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  1: &amp;lt;script &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;=&amp;quot;&lt;span style="color:#8b0000;"&gt;ActiveXExample&lt;/span&gt;&amp;quot; event=&amp;quot;&lt;span style="color:#8b0000;"&gt;ExampleEvent(text)&lt;/span&gt;&amp;quot;&amp;gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  2: &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt; {
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  3:     elem = &lt;span style="color:#0000ff;"&gt;document&lt;/span&gt;.getElementById(&amp;quot;&lt;span style="color:#8b0000;"&gt;status&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  4:     elem.innerHTML = text;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  5: } &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt;(exception) {
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  6:     &lt;span style="color:#0000ff;"&gt;alert&lt;/span&gt;(&amp;quot;&lt;span style="color:#8b0000;"&gt;Exception Thrown in Event: &lt;/span&gt;&amp;quot; + exception);
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  7: }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  8: &amp;lt;/script&amp;gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  9: &lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;I’m still not quite sure why the Object::Event syntax didn’t work, as it is shown often in ActiveX sample code.&amp;#160; Still, if you find you are having issues getting events to fire correctly, this alternate syntax may be worth trying.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;&lt;font size="4"&gt;Additional Resources &lt;/font&gt;&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa751977(VS.85).aspx"&gt;MSDN: Safe Initialization and Scripting for ActiveX Controls&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Eric Lippert's Fantastic Eight Part Series: Script and IE Security&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;a href="http://blogs.msdn.com/ericlippert/archive/2004/01/09/49114.aspx"&gt;One&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/ericlippert/archive/2004/01/13/58403.aspx"&gt;Two&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/ericlippert/archive/2004/01/14/58700.aspx"&gt;Three&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/ericlippert/archive/2004/01/15/59076.aspx"&gt;Four&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/ericlippert/archive/2004/01/20/60801.aspx"&gt;Five&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/ericlippert/archive/2004/01/21/61236.aspx"&gt;Six&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/ericlippert/archive/2004/01/22/61745.aspx"&gt;Seven&lt;/a&gt; and &lt;a href="https://beta.blogs.msdn.com/ericlippert/archive/2004/01/23/62302.aspx"&gt;Eight&lt;/a&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/rickm/archive/2009/06/03/net-2-0-activex-control-gotchas-safe-for-scripting-and-hooking-into-events.aspx&amp;amp;;subject=.NET+2.0+ActiveX+Control+Gotchas+(Safe+for+Scripting+and+Hooking+into+Events)" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/06/03/net-2-0-activex-control-gotchas-safe-for-scripting-and-hooking-into-events.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/06/03/net-2-0-activex-control-gotchas-safe-for-scripting-and-hooking-into-events.aspx&amp;amp;;title=.NET+2.0+ActiveX+Control+Gotchas+(Safe+for+Scripting+and+Hooking+into+Events)" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/06/03/net-2-0-activex-control-gotchas-safe-for-scripting-and-hooking-into-events.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/06/03/net-2-0-activex-control-gotchas-safe-for-scripting-and-hooking-into-events.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/06/03/net-2-0-activex-control-gotchas-safe-for-scripting-and-hooking-into-events.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/06/03/net-2-0-activex-control-gotchas-safe-for-scripting-and-hooking-into-events.aspx&amp;amp;title=.NET+2.0+ActiveX+Control+Gotchas+(Safe+for+Scripting+and+Hooking+into+Events)" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/06/03/net-2-0-activex-control-gotchas-safe-for-scripting-and-hooking-into-events.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/06/03/net-2-0-activex-control-gotchas-safe-for-scripting-and-hooking-into-events.aspx&amp;amp;;title=.NET+2.0+ActiveX+Control+Gotchas+(Safe+for+Scripting+and+Hooking+into+Events)" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/06/03/net-2-0-activex-control-gotchas-safe-for-scripting-and-hooking-into-events.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/06/03/net-2-0-activex-control-gotchas-safe-for-scripting-and-hooking-into-events.aspx&amp;amp;;title=.NET+2.0+ActiveX+Control+Gotchas+(Safe+for+Scripting+and+Hooking+into+Events)&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/06/03/net-2-0-activex-control-gotchas-safe-for-scripting-and-hooking-into-events.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=18569" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2B002B002F00_CLI/default.aspx">C++/CLI</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/internet+explorer/default.aspx">internet explorer</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/activex/default.aspx">activex</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/activex+control/default.aspx">activex control</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/com/default.aspx">com</category></item><item><title>How to determine which language(s) were used to build a .NET assembly</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx</link><pubDate>Thu, 26 Feb 2009 11:00:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:17547</guid><dc:creator>RickM</dc:creator><slash:comments>6</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/17547.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=17547</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=17547</wfw:comment><description>&lt;p&gt;While in most cases there is no explicit information in an assembly as to which languages it was compiled from, it is possible to make an educated guess as to which languages were used.&amp;#160; This is due to the fact that each different .NET compiler leaves it’s own unique type of fingerprint.&amp;#160; In this article I discuss both my methodology for finding these fingerprints and which were unique to each language I used.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Methodology&lt;/h3&gt;  &lt;p&gt;For each language I made a new class library project.&amp;#160; I then reflected and compared each assembly to determine which unique characteristics it had.&amp;#160; It turned out that, at least for C#, F#, VB and C++, each was uniquely identifiable by the existence, or lack thereof, of certain features. &lt;/p&gt;  &lt;p&gt;So to break it down a bit.&lt;/p&gt;  &lt;p&gt;In each project I added one class and one public method in each of those classes:&lt;/p&gt;  &lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:480px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;  1: &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; CSharpClass
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;  2: {
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;  3:     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; LocalMethod() {}
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;  4: }&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;After compiling each of these projects into it’s own assembly, I referenced them from another testing project.&amp;#160; To grab a set of features for each language, I used the following three reflection calls:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.reflection.assembly.gettypes(VS.80).aspx"&gt;Assembly.GetTypes()&lt;/a&gt;

    &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/hk0t7cax(VS.80).aspx"&gt;Assembly.GetCustomAttirbutes()&lt;/a&gt;

    &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/hfkct7ct(VS.80).aspx"&gt;Module.GetFields( BindingFlags.NonPublic | BindingFlags.Static )&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then, with a simple program, I found which of these features were unique for each language.&amp;#160; This set of unique features ultimately represents a map of the imprint each compiler leaves.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;F#&lt;/h3&gt;

&lt;p&gt;A compiled F# library will only have one attribute by default:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This made it the easiest to differentiate of all the languages I tested.&amp;#160; Even more interesting, this attribute contains three fields which specify the specific version of the F# compiler used to generate the assembly:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Major&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160;&amp;#160; int
    &lt;br /&gt;Minor&amp;#160;&amp;#160;&amp;#160; 9&amp;#160;&amp;#160;&amp;#160; int

    &lt;br /&gt;Release&amp;#160;&amp;#160;&amp;#160; 6&amp;#160;&amp;#160;&amp;#160; int &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I’m always impressed with how the F# team consistently goes above and beyond when it comes to the small details.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;Visual Basic&lt;/h3&gt;

&lt;p&gt;The Visual Basic assembly I generated was also easily identifiable via extra types which were automatically added:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;My.MyApplication
    &lt;br /&gt;My.MyComputer

    &lt;br /&gt;My.MyProject

    &lt;br /&gt;My.MyProject+MyWebServices

    &lt;br /&gt;My.MyProject+ThreadSafeObjectProvider`1

    &lt;br /&gt;My.Resources.Resource

    &lt;br /&gt;My.MySettings

    &lt;br /&gt;My.MySettingsProperty&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As you can see from this list, the existence of these types in the “My” namespace is a fairly safe indicator that the Visual Basic language was used.&amp;#160; &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;C++ CLI / Managed C++&lt;/h3&gt;

&lt;p&gt;C++/CLI and Managed C++ are considered to be the same language with slightly different syntax as they share the same compiler.&amp;#160; However, there are four different compilation modes for C++ and each has somewhat different results.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;/CLR – Common Language Runtime Support&lt;/li&gt;

  &lt;li&gt;/CLR:pure – Pure Common Language Runtime Support&lt;/li&gt;

  &lt;li&gt;/CLR:safe – Safe Common Language Runtime Support&lt;/li&gt;

  &lt;li&gt;/CLR:OldSyntax – Managed C++ Syntax&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;/CLR&lt;/strong&gt;, &lt;strong&gt;/CLR:pure&lt;/strong&gt; and &lt;strong&gt;/CLR:OldSyntax&lt;/strong&gt; settings provide easy to classify assemblies, as they all inject an enormous number of types (70+) into the assembly.&amp;#160; I verified that contained two types from the vc_attributes namespace:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;vc_attributes.YesNoMaybe
    &lt;br /&gt;vc_attributes.AccessType&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;However, &lt;strong&gt;/CLR:Safe&lt;/strong&gt; is much different in that it injects no types and adds no assembly attributes by default.&amp;#160; The generated assembly was almost completely clean.&amp;#160; I was forced to use Reflector to determine how to differentiate this from C#.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;C#&lt;/h3&gt;

&lt;p&gt;C# was one the most difficult to identify assembly type.&amp;#160; This is due to the fact that it has no unique types and only one unique attribute:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;System.Reflection.AssemblyConfigurationAttribute&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Unfortunately, this attribute is defined in the AssemblyInfo.cs file and so we can’t depend on it.&amp;#160; Up to this point it was only necessary to use two reflection calls:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.reflection.assembly.gettypes(VS.80).aspx"&gt;Assembly.GetTypes()&lt;/a&gt;

    &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/hk0t7cax(VS.80).aspx"&gt;Assembly.GetCustomAttirbutes()&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I was hoping to keep things very simple.&amp;#160; However, to differentance these two languages it’s necessary to go a bit further.&amp;#160; It turns out that C++ always injects an module level field into the assembly while C# does not.&amp;#160; And so by using:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/hfkct7ct(VS.80).aspx"&gt;Module.GetFields(BindingFlags.NonPublic | BindingFlags.Static)&lt;/a&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We can check for the existence of this kind of field and so differentiate these two types.&amp;#160; &lt;/p&gt;

&lt;p&gt;After some investigation with reflector, I was able to find one particular feature unique to C#.&amp;#160; Unfortunately, it requires disassembling functions and looking at the resulting IL.&amp;#160; It seems as though a function definition&lt;strong&gt; never has a .maxstack of less than 8&lt;/strong&gt;.&amp;#160; In all other languages I observed .maxstack had been set to values as low as 0 when defined in an empty function.&amp;#160; &lt;/p&gt;

&lt;p&gt;However, as I am only currently concerned with these four languages, my testing on this matter has been very shallow and so pleae take it with a grain of salt.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;I admit that my sample Assembly set was very small and my feature set very large.&amp;#160; However, while this type of classification may not be robust enough to be applicable to a system which depended on these results being absolutely true, I’ve shown that it is in fact entirely possible to make reasonably confident guesses as to the language used to generate a .NET assembly while using only simple reflection.&amp;#160; It would be interesting to see how well this holds for obfuscated assemblies as well as other “bare minimum” compilations generated via different combinations of compiler settings.&lt;/p&gt;

&lt;p&gt;The next obvious step would be to extend what I have already written into a full &lt;a href="http://www.codeproject.com/KB/cs/BayesClassifier.aspx"&gt;Bayesian classifier&lt;/a&gt;.&amp;#160; Would be much better than a hardcoded hierarchy which would be fragile and possibly completely and repeatedly incorrect for some cases.&amp;#160; Another big advantage of using &lt;a href="http://hunch.net/?p=230"&gt;machine learning here&lt;/a&gt;, is that it would be easy to add new features and classification categories.&amp;#160; &lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx&amp;amp;;subject=How+to+determine+which+language(s)+were+used+to+build+a+.NET+assembly" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx&amp;amp;;title=How+to+determine+which+language(s)+were+used+to+build+a+.NET+assembly" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx&amp;amp;title=How+to+determine+which+language(s)+were+used+to+build+a+.NET+assembly" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx&amp;amp;;title=How+to+determine+which+language(s)+were+used+to+build+a+.NET+assembly" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx&amp;amp;;title=How+to+determine+which+language(s)+were+used+to+build+a+.NET+assembly&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/26/how-to-determine-which-language-s-were-used-to-build-a-net-assembly.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=17547" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/programming/default.aspx">programming</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/F_2300_/default.aspx">F#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2B002B00_/default.aspx">C++</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/reflection/default.aspx">reflection</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2B002B002F00_CLI/default.aspx">C++/CLI</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/classification/default.aspx">classification</category></item><item><title>One of these languages is not like the others - Part 1 - Enforcement of Abstract Implementation</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/10/one-of-these-languages-is-not-like-the-others-part-1-enforcement-of-abstract-implementation.aspx</link><pubDate>Tue, 10 Feb 2009 15:47:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:17443</guid><dc:creator>RickM</dc:creator><slash:comments>5</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/17443.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=17443</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=17443</wfw:comment><description>&lt;p&gt;This is the first in a series of posts on the topic of interaction between different .NET languages.&amp;#160; I will cover all of the major Microsoft languages: C#, Visual Basic, F# and C++/CLI. &lt;/p&gt;  &lt;p&gt;In this first post in the series I will build a four language project in Visual Studio 2008 and begin to explore inter-language inheritance.&amp;#160; One of the languages behaves in a significantly different way when compared with the others, can you guess which one it is? &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Enforcement of Abstract Implementation&lt;/h3&gt;  &lt;p&gt;First things first, let’s define our abstract base class.&amp;#160; C# is considered the standard language for library architecting and so it is what we will be using.&lt;/p&gt;  &lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:480px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;  1: &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; abstract &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; CSharpBaseClass
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;  2: {
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;  3:   &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; abstract void PublicAbstractMethod();      
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;  4:   &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; abstract void PublicAbstractMethod(int inint);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;  5:   &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; abstract void ProtectedAbstractMethod();
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;  6:   &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; abstract void ProtectedAbstractMethod(int inint);
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;  7: }&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;In each of our child projects we will be inheriting from this class.&amp;#160; Let’s start with &lt;strong&gt;C#&lt;/strong&gt;. &lt;/p&gt;

&lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:480px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;  1: &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; CSharpChildClass : CSharpBaseClass
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;  2: {
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;  3: }&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Now anyone with even a bit of experience in the C# language knows that this won’t compile.&amp;#160; For each of the abstract methods in the base class the inheriting class is expected to provide an implementation. &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;… error CS0534: 'CSharpChild.CSharpChildClass' does not implement inherited abstract member …&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;This is similarly true for &lt;strong&gt;Visual Basic&lt;/strong&gt;. 

  &lt;br /&gt;&lt;/p&gt;

&lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:480px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;  1: &lt;span style="color:#0000ff;"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Class&lt;/span&gt; VBChildClass
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;  2:   &lt;span style="color:#0000ff;"&gt;Inherits&lt;/span&gt; CSharpBase.CSharpBaseClass
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;  3: &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Class&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;/pre&gt;

&lt;blockquote&gt;
  &lt;p&gt;… error BC30610: Class 'VBChildClass' must either be declared 'MustInherit' or override the following inherited 'MustOverride' member(s): &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;F#&lt;/strong&gt; shares this behavior as well.&lt;/p&gt;

&lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:480px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;  1: &lt;span style="color:#0000ff;"&gt;type&lt;/span&gt; FSharpChildClass() =
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;  2:   inherit CSharpBase.CSharpBaseClass()&lt;/pre&gt;&lt;/pre&gt;

&lt;blockquote&gt;
  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; … error FS0191: No implementation was given for 'CSharpBaseClass.PublicAbstractMethod() : unit'. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Kudos to the F# compiler designers for the verbose compile time errors. &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; error FS0054: This type is 'abstract' since some abstract members have not been given an implementation. If this is intentional then add the '[&amp;lt;AbstractClass&amp;gt;]' attribute to your type.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;However, &lt;strong&gt;C++/CLI&lt;/strong&gt; does not.&amp;#160; It’s perfectly acceptable to inherit from an abstract class and provide no implementation for it’s abstract members.&lt;/p&gt;

&lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:480px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;  1: &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ref &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; CppChildClass : &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; CSharpBaseClass
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;  2: {
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;  3: };&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;While a warning is issued, it seems insufficient for what has just taken place: &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;… warning C4570: 'CppChild::CppChildClass' : is not explicitly declared as abstract but has abstract functions &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The result is that the class in question is defaulted to abstract.&amp;#160; If someone where to attempt to instantiate it downstream, it would cause a compiler error:&lt;/p&gt;

&lt;pre style="border-right:#cecece 1px solid;padding-right:5px;border-top:#cecece 1px solid;padding-left:5px;min-height:40px;padding-bottom:5px;overflow:auto;border-left:#cecece 1px solid;width:480px;padding-top:5px;border-bottom:#cecece 1px solid;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#fbfbfb;"&gt;  1: CppChildClass cpp = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; CppChildClass();
&lt;/pre&gt;&lt;pre style="font-size:12px;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;background-color:#ffffff;"&gt;  2: cpp.LocalMethod();&lt;/pre&gt;&lt;/pre&gt;

&lt;blockquote&gt;
  &lt;p&gt;error CS0144: Cannot create an instance of the abstract class or interface 'ManagedCppChild.ManagedCppChildClass' &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is bad because, if you were an API developer and so did not consume all of your objects, it would be possible to ship a version of your product with abstract suddenly toggled on for one or more of your classes.&amp;#160; All it would take would be for a developer to add a new inherited class or member to an existing abstract base class without writing a corresponding test for every abstract member or inheriting class. &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;So, what can we learn from this?&amp;#160; It seem that when using C++/CLI (or managed C++) it is not sufficient to depend on abstract classes to enforce that members are implemented.&amp;#160; Testing must also be strictly enforced.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/10/one-of-these-languages-is-not-like-the-others-part-1-enforcement-of-abstract-implementation.aspx&amp;amp;;subject=One+of+these+languages+is+not+like+the+others+-+Part+1+-+Enforcement+of+Abstract+Implementation" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/10/one-of-these-languages-is-not-like-the-others-part-1-enforcement-of-abstract-implementation.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/10/one-of-these-languages-is-not-like-the-others-part-1-enforcement-of-abstract-implementation.aspx&amp;amp;;title=One+of+these+languages+is+not+like+the+others+-+Part+1+-+Enforcement+of+Abstract+Implementation" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/10/one-of-these-languages-is-not-like-the-others-part-1-enforcement-of-abstract-implementation.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/10/one-of-these-languages-is-not-like-the-others-part-1-enforcement-of-abstract-implementation.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/10/one-of-these-languages-is-not-like-the-others-part-1-enforcement-of-abstract-implementation.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/10/one-of-these-languages-is-not-like-the-others-part-1-enforcement-of-abstract-implementation.aspx&amp;amp;title=One+of+these+languages+is+not+like+the+others+-+Part+1+-+Enforcement+of+Abstract+Implementation" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/10/one-of-these-languages-is-not-like-the-others-part-1-enforcement-of-abstract-implementation.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/10/one-of-these-languages-is-not-like-the-others-part-1-enforcement-of-abstract-implementation.aspx&amp;amp;;title=One+of+these+languages+is+not+like+the+others+-+Part+1+-+Enforcement+of+Abstract+Implementation" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/10/one-of-these-languages-is-not-like-the-others-part-1-enforcement-of-abstract-implementation.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/10/one-of-these-languages-is-not-like-the-others-part-1-enforcement-of-abstract-implementation.aspx&amp;amp;;title=One+of+these+languages+is+not+like+the+others+-+Part+1+-+Enforcement+of+Abstract+Implementation&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/02/10/one-of-these-languages-is-not-like-the-others-part-1-enforcement-of-abstract-implementation.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=17443" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/F_2300_/default.aspx">F#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2B002B00_/default.aspx">C++</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/fsharp/default.aspx">fsharp</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/languages/default.aspx">languages</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2B002B002F00_CLI/default.aspx">C++/CLI</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/inheritance/default.aspx">inheritance</category></item><item><title>Changing Your Garbage Collector Settings on the Fly (.NET Memory Management: Part 5)</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2008/08/20/changing-your-garbage-collector-settings-on-the-fly-net-memory-management-part-5.aspx</link><pubDate>Wed, 20 Aug 2008 20:39:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:15313</guid><dc:creator>RickM</dc:creator><slash:comments>7</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/15313.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=15313</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=15313</wfw:comment><description>&lt;p&gt;It has come to my attention via a recent &lt;a href="http://dotnet.dzone.com/news/low-latency-gc-net-35"&gt;DZone article&lt;/a&gt; that .NET 3.5 and 2.0 SP1 jointly included a new feature which lets you manipulate the way your garbage collector acts programmatically.&amp;nbsp; This can be done through changing the value of a new property of the System.Runtime.GCSettings class named LatencyMode. In this article I will walk you through this new property and the different effects of each of it's possible settings.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Other Articles in This Series&lt;br&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2008/04/03/net-memory-managment-part-1-basic-housekeeping.aspx"&gt;Part 1 – Basic Housekeeping&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2008/04/15/improving-performance-through-stack-allocation-net-memory-management-part-2.aspx"&gt;Part 2 – Improving Performance Through Stack Allocation&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2008/04/22/increasing-the-size-of-your-stack-net-memory-management-part-3.aspx"&gt;Part 3 – Increasing the Size of your Stack&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2008/05/14/choosing-the-right-garbage-collector-settings-for-your-application-net-memory-management-part-4.aspx"&gt;Part 4 – Choosing the Right Garbage Collector Settings&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2008/08/20/changing-your-garbage-collector-settings-on-the-fly-net-memory-management-part-5.aspx"&gt;Part 5 – Changing Your Garbage Collector Settings on the Fly&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;LatencyMode&lt;/b&gt; &lt;br&gt;&lt;/p&gt;&lt;p&gt;The new LatencyMode property accepts three different enumerated values.&amp;nbsp; The first two of which are Batch and Interactive which correspond to turning &amp;lt;gcConcurrent&amp;gt; on and off inside of your application configuration.&amp;nbsp; However, the effects of the third value, which is named LowLatency, were previously unavailable by any means.&amp;nbsp; By setting this the LatencyMode to LowLatency you can now put the Garbage Collector in an ultra-conservative mode which will insure the application will be interrupted as infrequently as possible.&amp;nbsp; &lt;br&gt;&lt;/p&gt;&lt;p&gt;There are a couple of things you should take note of before changing your Garbage Collector's LatencyMode:&lt;br&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;LatencyMode settings are process-wide and so all of the threads in your application will be effected.&lt;/li&gt;&lt;li&gt;Changing LatencyMode will have no effect if your application has &amp;lt;gcServer&amp;gt; mode set in its configuration file.&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Now, let’s explore each of the possible values of LatencyMode in detail:&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Batch &lt;/b&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;When it’s useful: &amp;nbsp;&lt;br&gt;It’s useful in applications without a UI and in Server Based Software.&amp;nbsp; It may also be useful to switch your garbage collector into Batch latency mode if your application has a data crunching mode which occurs after a user interface.&lt;br&gt;&lt;/p&gt;&lt;p&gt;What it does: &lt;br&gt;This is the most intrusive setting.&amp;nbsp; Garbage Collection is done non-concurrently in one big batch call. Your program will be suspended while garbage collection takes place.&lt;br&gt;&lt;/p&gt;&lt;p&gt;Defaults:&lt;br&gt;This is the default value when &amp;lt;gcConcurrent&amp;gt; is disabled.&lt;br&gt;&lt;/p&gt;&lt;p&gt;Notes:&lt;br&gt;Even though this will be the enumeration which will be set if &amp;lt;gcServer&amp;gt; is enabled, the garbage collector will act as described in my &lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2008/05/14/choosing-the-right-garbage-collector-settings-for-your-application-net-memory-management-part-4.aspx"&gt;previous article&lt;/a&gt;.&amp;nbsp; In fact, if you have your application defined to be in &amp;lt;gcServer&amp;gt; mode the LatencyMode property cannot be changed from its default of “Batch”.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Interactive&lt;/b&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;When it’s useful:&lt;br&gt;It’s the best mode for most any UI-based application. &lt;br&gt;&lt;/p&gt;&lt;p&gt;What it does:&lt;br&gt;This is the most balanced setting.&amp;nbsp; Garbage Collection happens concurrently with your application.&amp;nbsp; Most of the work is done in a separate thread and although your application will be suspended it will not happen very often and for only very short periods of time. &lt;br&gt;&lt;/p&gt;&lt;p&gt;Defaults:&lt;br&gt;This is the default value for garbage collection on workstations.&amp;nbsp; If &amp;lt;gcConcurrent&amp;gt; is left at its default value, this is the type of garbage collection that will occur.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;LowLatency&lt;/b&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;When it’s useful:&lt;br&gt;It’s useful for time sensitive applications such as 3d rendering or data acquisition.&lt;br&gt;&lt;/p&gt;&lt;p&gt;What it does:&lt;br&gt;This is the least intrusive mode the Garbage Collector can be set to.&amp;nbsp; As in Interactive, garbage collections happen concurrently with your application.&amp;nbsp; However, collection of older objects will only happen when memory pressure becomes high.&amp;nbsp; Collection of generation 2 objects is kept to a bare minimum.&lt;br&gt;&lt;/p&gt;&lt;p&gt;Defaults:&lt;br&gt;This is never the default setting.&lt;br&gt;&lt;/p&gt;&lt;p&gt;Notes:&lt;br&gt;LowLatency mode was designed for short time use only during time-critical sections of your application.&amp;nbsp; Leaving an application in LowLatency mode for an extended period of time will cause unused objects accumulate.&amp;nbsp; Before using low latency mode, you should take a look at the guidelines laid out at the bottom of the &lt;a href="http://msdn.microsoft.com/en-us/library/bb384202.aspx"&gt;MSDN Latency Modes page&lt;/a&gt;. &lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;References&lt;/b&gt;&lt;br&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb384202.aspx"&gt;MSDN Visual Studio 2008 Developer Center – Latency Modes&lt;/a&gt;&lt;br&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.gclatencymode.aspx"&gt;MSDN .NET Framework Developer Center – GCLatencyMode Enumeration&lt;/a&gt;&lt;br&gt;&lt;a href="http://dotnet.dzone.com/news/low-latency-gc-net-35"&gt;DZone - Low-Latency GC in .NET 3.5&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/rickm/archive/2008/08/20/changing-your-garbage-collector-settings-on-the-fly-net-memory-management-part-5.aspx&amp;amp;;subject=Changing+Your+Garbage+Collector+Settings+on+the+Fly+(.NET+Memory+Management%3a+Part+5)" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/08/20/changing-your-garbage-collector-settings-on-the-fly-net-memory-management-part-5.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/08/20/changing-your-garbage-collector-settings-on-the-fly-net-memory-management-part-5.aspx&amp;amp;;title=Changing+Your+Garbage+Collector+Settings+on+the+Fly+(.NET+Memory+Management%3a+Part+5)" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/08/20/changing-your-garbage-collector-settings-on-the-fly-net-memory-management-part-5.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/08/20/changing-your-garbage-collector-settings-on-the-fly-net-memory-management-part-5.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/08/20/changing-your-garbage-collector-settings-on-the-fly-net-memory-management-part-5.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/08/20/changing-your-garbage-collector-settings-on-the-fly-net-memory-management-part-5.aspx&amp;amp;title=Changing+Your+Garbage+Collector+Settings+on+the+Fly+(.NET+Memory+Management%3a+Part+5)" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/08/20/changing-your-garbage-collector-settings-on-the-fly-net-memory-management-part-5.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/08/20/changing-your-garbage-collector-settings-on-the-fly-net-memory-management-part-5.aspx&amp;amp;;title=Changing+Your+Garbage+Collector+Settings+on+the+Fly+(.NET+Memory+Management%3a+Part+5)" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/08/20/changing-your-garbage-collector-settings-on-the-fly-net-memory-management-part-5.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/08/20/changing-your-garbage-collector-settings-on-the-fly-net-memory-management-part-5.aspx&amp;amp;;title=Changing+Your+Garbage+Collector+Settings+on+the+Fly+(.NET+Memory+Management%3a+Part+5)&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/08/20/changing-your-garbage-collector-settings-on-the-fly-net-memory-management-part-5.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=15313" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/F_2300_/default.aspx">F#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/code/default.aspx">code</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/optimization/default.aspx">optimization</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2B002B00_/default.aspx">C++</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/Tutorials/default.aspx">Tutorials</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/memory/default.aspx">memory</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/garbage+collection/default.aspx">garbage collection</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/gc/default.aspx">gc</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/fsharp/default.aspx">fsharp</category></item><item><title>Choosing the Right Garbage Collector Settings for Your Application (.NET Memory Management: Part 4)</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2008/05/14/choosing-the-right-garbage-collector-settings-for-your-application-net-memory-management-part-4.aspx</link><pubDate>Wed, 14 May 2008 18:11:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:14040</guid><dc:creator>RickM</dc:creator><slash:comments>5</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/14040.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=14040</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=14040</wfw:comment><description>Tuning the garbage collector to the specific context of the particular application can significantly improve the performance of both non-threaded and multi-threaded applications. In this post I discuss the gcConcurrent and gcServer settings which allow...(&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2008/05/14/choosing-the-right-garbage-collector-settings-for-your-application-net-memory-management-part-4.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=14040" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/F_2300_/default.aspx">F#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/code/default.aspx">code</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/optimization/default.aspx">optimization</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2B002B00_/default.aspx">C++</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/Tutorials/default.aspx">Tutorials</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/memory/default.aspx">memory</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/garbage+collection/default.aspx">garbage collection</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/gc/default.aspx">gc</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/fsharp/default.aspx">fsharp</category></item><item><title>Custom Serializing Objects for Use in a Debugger Visualizer</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2008/05/07/custom-serializing-objects-for-use-in-a-debugger-visualizer-codeproject.aspx</link><pubDate>Wed, 07 May 2008 19:02:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:13930</guid><dc:creator>RickM</dc:creator><slash:comments>0</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/13930.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=13930</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=13930</wfw:comment><description>I have a new CodeProject article up which details how to make a Debugger Visualizer in the case where you need to custom serialize the object. The actual classes I build in the tutorial are only useful with our DotImage project line. However, the process...(&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2008/05/07/custom-serializing-objects-for-use-in-a-debugger-visualizer-codeproject.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=13930" width="1" height="1"&gt;</description><enclosure url="http://www.atalasoft.com/cs/blogs/rickm/attachment/13930.ashx" length="53959" type="image/jpeg" /><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/code/default.aspx">code</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/Tutorials/default.aspx">Tutorials</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/Debugger/default.aspx">Debugger</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/VS2008/default.aspx">VS2008</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/VS2005/default.aspx">VS2005</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/Visualizer/default.aspx">Visualizer</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/Debugger+Visualizer/default.aspx">Debugger Visualizer</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/CodeProject/default.aspx">CodeProject</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>Basic Memory Housekeeping (.NET Memory Management: Part 1)</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2008/04/03/net-memory-managment-part-1-basic-housekeeping.aspx</link><pubDate>Thu, 03 Apr 2008 21:25:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:13602</guid><dc:creator>RickM</dc:creator><slash:comments>7</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/13602.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=13602</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=13602</wfw:comment><description>This is the first in a series of posts I will be writing about managing memory in .NET. Before I move on to more complex techniques, I thought it would be good to cover the basics. Articles in This Series Part 1 - Basic Housekeeping Part 2 - Improving...(&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2008/04/03/net-memory-managment-part-1-basic-housekeeping.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=13602" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2B002B00_/default.aspx">C++</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/Tutorials/default.aspx">Tutorials</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/memory/default.aspx">memory</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/struct/default.aspx">struct</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/structs/default.aspx">structs</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/IDisposable/default.aspx">IDisposable</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/garbage+collection/default.aspx">garbage collection</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/gc/default.aspx">gc</category></item><item><title>Counting Processors in .NET: The Pros and Cons of Five Different Methods</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2008/04/01/counting-processors-in-net-the-pros-and-cons-of-five-different-methods.aspx</link><pubDate>Tue, 01 Apr 2008 18:54:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:13585</guid><dc:creator>RickM</dc:creator><slash:comments>4</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/13585.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=13585</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=13585</wfw:comment><description>There are a great number of different ways to count the number of processors available to the .NET developer. In this post I will go over some of the more common methods and their pros and cons. The Envirionment.ProcessorCount Way Code: Environment .ProcessorCount;...(&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2008/04/01/counting-processors-in-net-the-pros-and-cons-of-five-different-methods.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=13585" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/programming/default.aspx">programming</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/code/default.aspx">code</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2B002B00_/default.aspx">C++</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/Processors/default.aspx">Processors</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/VB.NET/default.aspx">VB.NET</category></item></channel></rss>