<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>A Developer's Notes</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/brianwehrle/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/brianwehrle/feed.xml</link>
    <description />
    <lastBuildDate>Wed, 17 Apr 2019 04:08:21 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Useful tips when using Patterns and Practices Component Application Block (CAB)</title>
      <link>https://docs.microsoft.com/archive/blogs/brianwehrle/useful-tips-when-using-patterns-and-practices-component-application-block-cab</link>
      <pubDate>Mon, 08 Jan 2007 18:41:00 GMT</pubDate>
      <dc:creator><![CDATA[MSDN Archive]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/brianwehrle/2007/01/08/useful-tips-when-using-patterns-and-practices-component-application-block-cab/</guid>
      <description><![CDATA[The CAB is an excellent resource for application development.&nbsp; With the proper techniques, it...]]></description>
      <content:encoded><![CDATA[<P>The CAB is an excellent resource for application development.&nbsp; With the proper techniques, it leads to clean, separated logic and definite, manageable layers of code.&nbsp; However, there is one problem: little documentation.&nbsp; With the Smart Client Factory, more example code has been added, and there is more guidance.&nbsp; I thought that I would make a running list of the little problems I have found and solutions that I discovered.&nbsp; I hope these are useful, because I have not seen any other listing with answers to these "basic" scenarios that seem necessary.&nbsp; The documentation would be better with an extensive FAQ regarding issues like these.</P>
<P mce_keep="true">1.&nbsp; How to create a modal dialog:</P>
<P>Suppose you have a workSpace already defined (like a TabWorkSpace).&nbsp; Inside of a WorkItem, in the Run(IWorkspace workSpace) method, create a new workspace of type WindowWorkSpace and using a WindowWorkSpaceInfo, set the value for modal to be true.&nbsp; When you call the Show method, you'll see a new, modal window appear:</P><FONT size=2>
<P>windowWorkSpace.Show(smartPart, workSpaceInfo);</P>
<P></FONT>2.&nbsp; How to close a window:</P>
<P>Calling Deactivate() on the WorkItem only makes it not the active work item.&nbsp; You need to do this from a WorkSpace method, assuming you only have one SmartPart:<BR></P>
<P>this.WorkSpaces[ myWorkSpaceName ].Close( this.Items[ mySmartPartName ] );</P>
<P>Once all SmartParts are closed, the Workspace closes and then the UI window associated will go away if there are no more work items.</P>
<P>3.&nbsp; How to correctly use the Event notification mechanism</P>
<P>You need to make sure that you use prototypes that follow this general pattern:</P><FONT color=#0000ff size=2>
<P>public</FONT><FONT size=2> </FONT><FONT color=#0000ff size=2>class</FONT><FONT size=2> </FONT><FONT color=#008080 size=2>TestStatus</FONT><FONT size=2> : </FONT><FONT color=#008080 size=2>EventArgs</P></FONT><FONT size=2>
<P>{</P></FONT><FONT color=#0000ff size=2>
<P>}&nbsp;</P>
<P>public</FONT><FONT size=2> </FONT><FONT color=#0000ff size=2>class</FONT><FONT size=2> </FONT><FONT color=#008080 size=2>Test</P></FONT><FONT size=2>
<P>{</P>
<P></FONT><FONT size=2>[</FONT><FONT color=#008080 size=2>EventPublication</FONT><FONT size=2>(</FONT><FONT color=#800000 size=2>"event://Status"</FONT><FONT size=2>, </FONT><FONT color=#008080 size=2>PublicationScope</FONT><FONT size=2>.WorkItem)]</P>
<P></FONT><FONT color=#0000ff size=2>public</FONT><FONT size=2> </FONT><FONT color=#0000ff size=2>event</FONT><FONT size=2> </FONT><FONT color=#008080 size=2>EventHandler</FONT><FONT size=2>&lt;</FONT><FONT color=#008080 size=2>Status</FONT><FONT size=2>&gt; StatusNotification;</P></FONT><FONT size=2>
<P>}</P>
<P mce_keep="true">&nbsp;</P>
<P>[</FONT><FONT color=#008080 size=2>EventSubscription</FONT><FONT size=2>(</FONT><FONT color=#800000 size=2>"event://Status"</FONT><FONT size=2>, Thread=</FONT><FONT color=#008080 size=2>ThreadOption</FONT><FONT size=2>.UserInterface)] </P>
<P></FONT><FONT color=#0000ff size=2>public</FONT><FONT size=2> </FONT><FONT color=#0000ff size=2>void</FONT><FONT size=2> myClass_NotifyOnStatusChange(</FONT><FONT color=#0000ff size=2>object</FONT><FONT size=2> sender, </FONT><FONT color=#008080 size=2>Status</FONT><FONT size=2> test)</P>
<P>{</P>
<P></FONT>}&nbsp;</P>
<P>Otherwise the event system will complain if the type of the event arguments&nbsp;involved to not have the correct parent class types.</P>
<P>4.&nbsp; Serializing a set of work actions</P>
<P>Normally a UI has a flow, where the user does a task.&nbsp; First selecting files, then clicking a button and then a dialog pops up.&nbsp; Well, how do I chaing work-items together to make a coherent use-case for the user?&nbsp; That's easy: using a WorkItem, create a new work item that gets added to the WorkItems property.&nbsp; When the child's Run(IWorkSpace childWorkSpace) method is called, the parent WorkItem gets deactivated and the child "gains the focus" of the application.</P><FONT size=2>
<P></FONT><FONT color=#0000ff size=2>class</FONT><FONT size=2> </FONT><FONT color=#008080 size=2>MainWorkItem</FONT><FONT size=2> : </FONT><FONT color=#008080 size=2>WorkItem</P></FONT><FONT size=2>
<P>{</P></FONT><FONT size=2>
<P></FONT><FONT color=#0000ff size=2>public</FONT><FONT size=2> </FONT><FONT color=#0000ff size=2>void</FONT><FONT size=2> Run(</FONT><FONT color=#008080 size=2>IWorkspace</FONT><FONT size=2> tabWorkSpace)</P>
<P>{</P>
<P>currentWorkSpace = tabWorkSpace;</P>
<P>Login.</FONT><FONT color=#008080 size=2>LoginWorkItem</FONT><FONT size=2> loginWorkItem = Parent.WorkItems.AddNew&lt;</FONT><FONT color=#008080 size=2>LoginWorkItem</FONT><FONT size=2>&gt;();</P>
<P>loginWorkItem.Run(currentWorkSpace);</P>
<P></FONT><FONT color=#0000ff size=2>if</FONT><FONT size=2> (loginWorkItem.LoginInSuccess == </FONT><FONT color=#0000ff size=2>false</FONT><FONT size=2>)</P>
<P>{</P>
<P>&nbsp;&nbsp;&nbsp; loginWorkItem.Terminate();</P>
<P></FONT><FONT color=#0000ff size=2>&nbsp;&nbsp;&nbsp; return</FONT><FONT size=2>;</P>
<P>}</P>
<P></FONT><FONT color=#008080 size=2>SelectorWorkItem</FONT><FONT size=2> mainWorkItem = Parent.WorkItems.AddNew&lt;</FONT><FONT color=#008080 size=2>SelectorWorkItem</FONT><FONT size=2>&gt;();</P>
<P>mainWorkItem.Run(currentWorkSpace);</P>
<P mce_keep="true">&nbsp;</P>
<P>}</P></FONT>
<P>5.&nbsp; Making&nbsp;data available from one WorkItem to its aggregate members</P>
<P>The members of WorkItems' collections (called Items[])&nbsp;can receive references from their parent work items using declarative or programtic methods.&nbsp; These members can be presenters, smartparts or any other object that is related to the WorkItem.&nbsp; The items in the State or Items collections are available to the children WorkItems using the following declarative syntax, and the values are applied when the child objects are added to the Item collection (via Add() or AddNew())</P>
<P>[State("myStateName")]</P>
<P>public String StateValue</P>
<P>{&nbsp; set { this.myVariable = value; }&nbsp;&nbsp; get { return this.myVariable; }</P>
<P mce_keep="true">&nbsp;</P>
<P>[Dependency]</P>
<P>public MyClass MyClassInstanceProp</P>
<P>{</P>
<P>&nbsp;set { this.myVariable = value; }&nbsp; get{ return this.myVariable; }</P>
<P>}</P>
<P mce_keep="true">When either of theses methods are declared, they are used at run time to fill in the values of the Properties with the values contained in the corresponding objects help by the parent's WorkItem.&nbsp; </P>
<P mce_keep="true">This same technique works to pass information from WorkItems to the instances that are contained in its WorkItems collection, when creating a child WorkItem from inside the context of the parent WorkItem.&nbsp; Note that the Items[] and State[] collection is not shared amongst WorkItem instances, but is used by the ObjectBuilder to set the appropriate properties.</P>
<P>6.&nbsp; Sharing data&nbsp;amongst all WorkItems, or pushing data up from a child WorkItem to a parent</P>
<P>&nbsp;When you create an object instance and add it to the Services collection of the parent WorkItem, it will be available to all the WorkItems below that WorkItem.&nbsp; This provides a convenient method of passing data back up from a child WorkItem to a more upper layer, by using a stateful Data Transfer Object.</P>
<P>You can automatically get&nbsp;a reference to this service by using the following declarative example:</P><FONT size=2>
<P>[</FONT><FONT color=#008080 size=2>ServiceDependency</FONT><FONT size=2>]</P>
<P></FONT><FONT color=#0000ff size=2>public</FONT><FONT size=2> </FONT><FONT color=#008080 size=2>IWorkItemTypeCatalogService</FONT><FONT size=2> myWorkItemCatalog</P>
<P>{</P>
<P></FONT><FONT color=#0000ff size=2>set</FONT><FONT size=2> { myCatalogService = </FONT><FONT color=#0000ff size=2>value</FONT><FONT size=2>; }</P>
<P>}</P></FONT>
<P>7.&nbsp; Using a specific instance of an object to meet a dependency on an abstract interface</P><FONT size=2>
<P>If we register a concrete object that implements an interface, we would like to use that instance when a specific dependency on that interface is specified.&nbsp; By default, since the types are not the same, the&nbsp;existing object will not be used.&nbsp; That is, as below, the ObjectBuilder will look for an object of type ITestSelectorView, and find none, even if an instance of a specific object exists that satisfies this requirement.&nbsp; In this case, the name for for the instance is just for convenience, and is not needed.</P>
<P>[</FONT><FONT color=#008080 size=2>DependencyAttribute</FONT><FONT size=2>(NotPresentBehavior= </FONT><FONT color=#008080 size=2>NotPresentBehavior</FONT><FONT size=2>.Throw, Name= </FONT><FONT color=#008080 size=2>"InstanceName"</FONT><FONT size=2>)]</P>
<P></FONT><FONT color=#0000ff size=2>public</FONT><FONT size=2> </FONT><FONT color=#008080 size=2>ITestSelectorView</FONT><FONT size=2> ISelectorView</P>
<P>{&nbsp; set { myView = value;} }</P>
<P>&nbsp;But, if we add this code to the WorkItem that creates the object, we can make sure it picks the correct instance, which implements the interface:</P><FONT color=#0000ff size=2>
<P>this</FONT><FONT size=2>.InnerLocator.Add(</FONT><FONT color=#0000ff size=2>new</FONT><FONT size=2> </FONT><FONT color=#008080 size=2>DependencyResolutionLocatorKey</FONT><FONT size=2>(</FONT><FONT color=#0000ff size=2>typeof</FONT><FONT size=2>(</FONT><FONT color=#008080 size=2>ITestSelectorView</FONT><FONT size=2>), "<FONT color=#008080>InstanceName"</FONT>), concreteObjectInstance);</FONT></P>
<P><FONT size=2>This is very useful for making use of concrete instances to fulfill abstract requirements, and it is not overly complicated.</FONT><FONT size=2></P></FONT>
<P>8.&nbsp; Deactivating one WorkItem so that a new WorkItem will appear</P>
<P mce_keep="true">If you activate the SmartParts in a different WorkItem, the current active WorkItem will be made inactive.&nbsp; This is the primary way in which a use case works, from one WorkItem to the next.&nbsp; To stop using a WorkItem and make it disappear (useful in the case of a modal WindowWorkSpace) you can call the Terminate() method of the related WorkItem.</P>
<P>9.&nbsp; Using the State collection sparingly (to avoid writing Property accessors that cast the results accordingly)</P>
<P>You can encapsulate the WorkItem state within a separate class which can then be used to read and write important state variables from (without having to directly use the State collection).&nbsp; This class then can be written to the State collection to make use of the StatePersistence service, without the overhead of having to use the State collection for every instance data member.&nbsp;&nbsp;&nbsp; Since the presenter contains the presentation state, the WorkItem should contain the business logic state.</P>
<P>The alternative is to create a property that returns the correct type once the object instance is retrieved from the State collection.&nbsp; This can get rather annoying quickly, and collapsing the related state into a single class is a more clean alternative.</P>
<P>10.&nbsp; Getting more ideas for using the correct patterns in your design ..... </P>
<P>Look at the sample application, especially in the Smart Client package from the Patterns and Practices group, and look for more rich sample applications that illustrate different models or outlines which can make for consistent designs.&nbsp; The best way implement an application is to have all of the patterns established so that the implementation will be internally consistent.</P>
<P>This is one example: <A href="https://www.ideablade.com/cabana/cabana.html?=msp&amp;p">https://www.ideablade.com/cabana/cabana.html?=msp&amp;p</A></P></FONT>]]></content:encoded>
    </item>
    <item>
      <title>Making WiFi secure for shared use</title>
      <link>https://docs.microsoft.com/archive/blogs/brianwehrle/making-wifi-secure-for-shared-use</link>
      <pubDate>Mon, 08 Jan 2007 18:27:00 GMT</pubDate>
      <dc:creator><![CDATA[MSDN Archive]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/brianwehrle/2007/01/08/making-wifi-secure-for-shared-use/</guid>
      <description><![CDATA[WiFI Hot-spot Security: Accessible and secure

&nbsp;

The only real answer to creating a...]]></description>
      <content:encoded><![CDATA[

<p class="MsoNormal">WiFI Hot-spot Security: Accessible and secure</p>

<p class="MsoNormal"><o:p>&nbsp;</o:p></p>

<p class="MsoNormal">The only real answer to creating a secure hotpot is via a
VPN solution.<span style="">&nbsp; </span>There are few other
alternatives which make any sense, and none of which have been widely
adopted.<span style="">&nbsp; </span>The problems have to do with
disparte WiFi technology and non-existent standard provisioning policies or protocols
to deal with this and to manage this domain.</p>



<p class="MsoNormal"><o:p>&nbsp;</o:p>First, not all WiFi hardware has been created equal and not
all WiFi security protocols are created equal.<span style="">&nbsp;
</span>WEP is not secure and should not be used, unless backed by a layer-3
security, like IPSec and a frequent re-authentication coupled with a
station-unique encryption key and IV.<span style="">&nbsp;
</span>Only enterprise hardware is capable of meeting these requirements, and
they are not suitable for a consumer-grade network like a hotspot.<span style="">&nbsp; </span></p>



<p class="MsoNormal"><o:p>&nbsp;</o:p><br>WPA2 (802.11i) is the only security that can be used on a
network, however, in order to authenticate with WPA, you either need a key
(WPA-PSK) or to use one of the 802.1X authentication methods, which then
becomes more complicated: not every OS supports the same authentication
methods.<span style="">&nbsp; </span>Microsoft favors PEAP-MSCHAPv2,
which is a doubly-secure user-name/password authentication protocol.<span style="">&nbsp; </span>However, this is only one step of a sign-on process; first the user must acquire (purchase) credentials, etc. which must be done using a connection.&nbsp; But first, if 802.1X is to be used, a common method must be found, and it must be integrated into the sign-on process. &nbsp;<span style=""></span>One
common protocol is EAP-TLS, with a competing EAP-TTLS, but these rely on
certificates, which only complicate matters.&nbsp; Using certificates is way more trouble than it is worth, even for the enterprise.<span style="">&nbsp; In fact, </span>Windows Vista now defaults to attempting PEAP-MSCHAPv2 first, because
people have moved away from certificate-based authentication due to the
complexities.<span style="">&nbsp; </span>Certificates just make
things more complicated.</p>



<p class="MsoNormal">So, when someone wants to connect to your hotspot, how does
it work?<span style="">&nbsp; </span>First, they must be able to
connect, so the network must be Open.<span style="">&nbsp;
</span>Then, usually, the hotspot redirects all incoming HTTP requests to their
sign-in machine, protected by SSL, to allow for client to sign on and receive
access.<span style="">&nbsp; </span>Now what?<span style="">&nbsp; </span>They are given access and begin to surf the
net on an unsecure network.<span style="">&nbsp; </span>That's not a
good idea.</p>



<p class="MsoNormal"><o:p>&nbsp;</o:p>Under a Microsoft technology called WPS (Wireless
Provisioning Service), a provisioning client downloads information from the
secure HTTP server during a simple authentication phase (in which the server is
authenticated, and the client uses default credentials) and facilitated the
connection in such a way as to provision the client to securely connect with
the correct PEAP-MSCHAPv2 authentication strings (a customer-specific username
and password) once sign-up was finished.<span style="">&nbsp;
</span>Also, this connection would then work with partner hot-spots, where the
credentials would also be accepted.<span style="">&nbsp; </span>It
is a cool technology built into every Windows XP SP2 installation (now almost
the entire world), allows for secure access and has a good license for other
adopters.<span style="">&nbsp; </span>Unfortunately, uptake was slow
and this technology was removed from Windows Vista except for the ability to
provision a machine with profiles.<span style="">&nbsp; </span>Why
was this so difficult to get people to adopt?</p>



<p class="MsoNormal"><o:p>&nbsp;</o:p>Mostly because WiFi networks are part of a larger eco-system
and the technologies are disparate and everyone likes their standard.<span style="">&nbsp; </span>People don't want to use your protocol; they
want to use their own, and it has to work with the mobile devices, mobile
phones, etc.</p>



<p class="MsoNormal"><o:p>&nbsp;</o:p>This is why there are no elegant solutions- because the
elegant solutions don’t work for everybody. <span style="">&nbsp;</span>The best solution is the typical open-none
hotspot (accessible to everyone) with a HTTPS sign-in page and a VPN connection
for security (like Open VPN, but facilitated by the hotspot). <span style="">&nbsp;</span>Too complicated?<span style="">&nbsp; </span>Unfortunately, there are no good
alternatives.<span style="">&nbsp; </span>This is just one case of
the technology getting ahead of the community collective thought process.</p>



<p class="MsoNormal"><o:p></o:p>However, I still thing that Microsoft’s solution IS very
elegant, and would be an excellent choice. <span style="">&nbsp;</span>Plus, is allows for a custom sign-on process
that allows for support information, and a standard user-experience.<span style=""></span></p>



]]></content:encoded>
    </item>
    <item>
      <title>An .NET archival tool using Serialization and Compression/Encryption IOStreams</title>
      <link>https://docs.microsoft.com/archive/blogs/brianwehrle/an-net-archival-tool-using-serialization-and-compressionencryption-iostreams</link>
      <pubDate>Tue, 05 Dec 2006 19:32:00 GMT</pubDate>
      <dc:creator><![CDATA[MSDN Archive]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/brianwehrle/2006/12/05/an-net-archival-tool-using-serialization-and-compressionencryption-iostreams/</guid>
      <description><![CDATA[Recently I was looking at writing a file archival, encryption and compression utility in managed...]]></description>
      <content:encoded><![CDATA[<P mce_keep="true"><FONT size=3><FONT face="Times New Roman">Recently I was looking at writing a file archival, encryption and compression utility in managed code.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Since I didn't want re-invent anything, I wrote a simple pipe-line framework, where each section uses the output of the previous stage's stream.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>The head file stream is then used for any read or write IO.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Each stage is configured to decrypt/encrypt, compress or expand, depending on the direction of the IO (read, or write).<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman">FileStream &lt;-- CompressionStream<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>&lt;--- EncryptionStream (Head, writing)<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman">FileStream --&gt; DecompressionStream ---&gt; DescryptionStream (Head, reading)<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman">This is all very simple, and works like a command shell IO pipe.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I can write data to the top of the stream and it filters down to the bottom layers, where it eventually ends up in the file system (or in memory).&nbsp; When I was done, I thought it might be interesting to share regarding how .NET serialization can be combined with the IOStreams to make some cool technology with little work.</FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman">The component I specifically needed was an archiver, like TAR, plus the other pipeline stages that I use on my command line on my Linux box (gasp!)<SPAN style="mso-spacerun: yes">&nbsp; </SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><CODE><B><SPAN style="FONT-SIZE: 10pt">tar cf</SPAN></B></CODE><CODE><SPAN style="FONT-SIZE: 10pt"> <B>-</B><I> * </I><B>|&nbsp; gzip -c &gt;</B> <I>tarfile</I><B>.tar.gz<o:p></o:p></B></SPAN></CODE></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman">Since the .NET Framework already offers serialization, I decided to extend that to serializing objects that represented the files, using serialization.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Lets not exaggerate; TAR is much cooler than anything I wrote (and is much harder to use).<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>But since Microsoft doesn’t supply a nice managed/unmanaged archiving tool, and WinZip is not on my test machines and doesn't offer encryption, I figured it would be faster just to write one, with the added bonus that I could make it do custom actions by plugging in different stages.<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman">By creating a class that encapsulates the file's full path, file name (in this case only part of a file's data, not including alternate streams, or ACLs), and data, we have a simple archiving mechanism.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>You need to write some code that is trigged by the OnSerializing attribute and the Deserialized attribute: to read in the file data (into the fileData member) from the correct file, and then to write it out to the newly created/over-written file upon deserialzing (unpacking the archive).<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman">[Serializable]<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman">public <STRONG>class</STRONG> FileArchiver<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman">{<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>private String fileName;<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>private byte[] fileData;<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>...<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman">}<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman">The archive is simply a serialization of a List&lt;FileArchive&gt; instance, which contains all of the data stored in the respective files.<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman">List&lt;FileArchiver&gt; filesToAddToArchive;<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman">serializer.Serialize( stream, filesToAddToArchive);<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman">Make sure you use the BinarySerializer, for smaller file sizes and faster archival run times!<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>XML is cool, as cool as UTF-8 can be, but way less efficient as opposed to binary formats.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I once timed the difference between a binary protocol and XML-based protocol.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I think there was a 1000% difference in there transaction times. <SPAN style="mso-spacerun: yes">&nbsp;</SPAN>XML processing is slow, even if writing the wordy output is not necessarily much slower.<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman">Now, what about encryption?<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Asymmetric encryption was important for the application, since using a shared key is less secure, and for my application I wanted to use simple RSA keys, as opposed to using certificate.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>These keys are usually expressed as two parts, a public and private key, and stored in a file, or a Windows Key Container (more secure).<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>To do the actual encryption, the encryption method generates a temporal key, which is then used to encrypt the data.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>This key is then itself encrypted via the public part of the key, and embedded into the file, or sent apart.<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman">In the application we want to encrypt in-line, meaning by only processing the file once.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Plus this is a pipeline, and it must read and write in one go, and we are already using serialization to serialize the file archive.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>So logically we need to serialize the encrypted key as well.<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman">In the case of archiving, upon initializing the encryption stage reads in the RSA public key and it writes out the temporal key from the symmetric encryption method.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>This key is used later in the symmetric encryption of the actual data, and you can use any symmetric algorithm you like here.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>The standard for symmetric encryption is AES, which is required for all government and hospital IT systems, at least in the <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><st1:country-region w:st="on"><st1:place w:st="on">US</st1:place></st1:country-region>.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I believe that this will become part of a larger standard as well. <SPAN style="mso-spacerun: yes">&nbsp;</SPAN>RijndaelManaged is the .NET implementation and it is definitely the symmetric algorithm to use.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>If you are doing any serious encryption, use a 128- or 192-bit key as well.<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT face="Times New Roman" size=3>So, if we encrypt the temporal key and Initialiation Vector (IV) with the RSA public key, we can serialize this data into the file stream as well, using the same mechanism.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Here is our simple property-bucket class to hold these two byte arrays:</FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman">[Serializable]<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman"><STRONG>class</STRONG> EncryptedSessionKey<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman">{<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>public byte[] encryptedKey;<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>public byte[] encryptedIV;<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>public EncryptedSessionKey() {}<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman">}<o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman">Then we can start writing the rest of the data to the archival data stream; and now that the encryption module had written out the encrypted key header, it will not encrypt the data written through it, and thus the output file looks like this, with two sections, each a sort of convolution of the sum of the steps.&nbsp; This includes using the compressor pipeline stage, which is more obvious:</FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman"><STRONG>Compressed</STRONG> [Serialized <U>EncryptedSessionKey</U>]] <o:p></o:p></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT size=3><FONT face="Times New Roman"><STRONG>Compressed</STRONG>[<EM>Encrypted</EM>{Serialized <U>List&lt;FileArchiver&gt;</U>}</FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT face="Times New Roman" size=3>Cool serialization trick, certainly not novel, but still interesting.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Make sure you configure the symmetric encryption to use padding for writes that do not follow block sizes, otherwise you may not be able to write the encrypted data. <SPAN style="mso-spacerun: yes">&nbsp;</SPAN>By default, I believe a padding format is enabled.</FONT></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT face="Times New Roman" size=3>The reverse of this process has exactly the same steps, and the only difference is that the objects are deserialized and each pipeline is configured to do the reverse of what it was doing before.</FONT></P>]]></content:encoded>
    </item>
    <item>
      <title>.NET Enumerators vs. STL- STL.NET is still not released</title>
      <link>https://docs.microsoft.com/archive/blogs/brianwehrle/net-enumerators-vs-stl-stl-net-is-still-not-released</link>
      <pubDate>Sun, 03 Dec 2006 18:44:00 GMT</pubDate>
      <dc:creator><![CDATA[MSDN Archive]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/brianwehrle/2006/12/03/net-enumerators-vs-stl-stl-net-is-still-not-released/</guid>
      <description><![CDATA[As a frequent STL user, I can say that iterators are indispensable, but often an Achille's heel for...]]></description>
      <content:encoded><![CDATA[<p>As a frequent STL user, I can say that iterators are indispensable, but often an Achille's heel for those new to STL.&nbsp; It is easy to use iterators incorrectly, such as by not obeying the conventions, or modifying the collection in an inobvious way such as to invalidate the iterator.<br><br>One common STL problem is deletion, in this case, if the last element is deleted, the iterator it be moved beyond the end of the collection.&nbsp; This is a typical beginers mistake; the STL environment provides for an implementation of this algorithm that correctly deals with the iterator (using a while loop).&nbsp; Beyond that, STL is just a little more complicated for the uninitiated, but Iterators are not the most complicated part, and they are generally easy to use and straightforward.<br><br>for (it = collection.begin(); it != collection.end(); it++)<br>{<br><br>&nbsp; if ( (*it).BoolMethod() )<br>&nbsp;&nbsp; &nbsp;it = collection.erase( it );<br><br>}<br><br>Sadly, .NET's Enumerators are a far cry from STL's and they leave us with much less control or power.&nbsp; Inorder to reverse traverse a collection, you either must reverse the collection (an O(1) operation) or simply write a different loop with an index that moves through the elements in reverse (as opposed to a reverse iterator)<br><br>for ( int i= collection.Count-1; i &gt;= 0; i--) &nbsp;<br>{<br>&nbsp;&nbsp; &nbsp;// Do work<br>}<br><br>"i" in this case is a fairly poor iterator.&nbsp; This is a concrete value that defines the boundaries of a class, and is not an extensible object.<br>The advantage is that this is much more understandable to the VB user; Iterators and Generics are much more complicated.&nbsp; It is something that happens in the .NET space; the interface speaks to the average developer, not the C++ developer.&nbsp; Or the Java developer.<br><br>On the other hand, less power means fewer bugs!&nbsp; During a discussion with a co-worker, it was pointed out that adding more complicated features would increase the number of bugs.&nbsp; In the practical sense, this is true; if you have no features, there can be no bugs.&nbsp; But finding the mid-point between useful features and unneeded complexity is important, and you need to consider the people who will use them is another.<br><br>STL.NET (STL/CLI) Preview release (Sept. 2006) for use with the pre-release of VS 2005+1 ( called "Orcas", which is the next release of Visual Studio).&nbsp; <br></p><p>STL.NET Release announcement<br>https://blogs.msdn.com/nikolad/archive/2006/09/30/STCLRinOrcasSeptemberCTP.aspx<br></p><p><br>STL.NET Primer</p><p>https://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/stl-netprimer.asp<br></p>]]></content:encoded>
    </item>
    <item>
      <title>ClickOnce problems: Windows Authentication and the ClickOnce boot-strapping process</title>
      <link>https://docs.microsoft.com/archive/blogs/brianwehrle/clickonce-problems-windows-authentication-and-the-clickonce-boot-strapping-process</link>
      <pubDate>Fri, 01 Dec 2006 14:34:00 GMT</pubDate>
      <dc:creator><![CDATA[MSDN Archive]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/brianwehrle/2006/12/01/clickonce-problems-windows-authentication-and-the-clickonce-boot-strapping-process/</guid>
      <description><![CDATA[I was testing my "Hello World" application today and validating that it worked correctly with the...]]></description>
      <content:encoded><![CDATA[<p>I was testing my "Hello World" application today and validating that it worked correctly with the ClickOnce deployment tools and with our SharePoint setup.&nbsp; The requirements of the final application include that it be launchable from external partner sites and via a secure SharePoint site (over HTTPS, using NTLM authentication).&nbsp; I discovered that this is not a well-covered scenario and the ClickOnce works only for&nbsp;users logged into domain account (on domain-joined machines), and in some cases, when they are&nbsp;in the same enterprise (domain forest).&nbsp; This really surprised me.&nbsp; And the latter issue also blocked me&nbsp;personally as well from using my test "deployment" because of the peculiarities of my own domain account and the group I am currently working in.&nbsp; I'll explain the problem below ...</p>
<p>After reading the MSDN articles, I found out that ClickOnce only supports NTLM "Windows Authentication" when using HTTP/S.&nbsp; This means that no other authentication methods will work, except for no authentication.&nbsp; Furthermore, the default Windows log-on credentials are used.&nbsp; If the HTTP/S request fails, then the "boot loader", which handles the downloading and initialization of the application,&nbsp;fails.</p>
<p>There are two situations in which this does not work: the first is where the user is not logged into a domain account, and has opened the application's deployment URL via Internet Explorer.&nbsp; IE will graciously ask for difference credentials if the default ones do not work.&nbsp; The ClickOnce bootloader is not so intelligent, at least in .Net Framework 2.0.&nbsp; So the application manifest is visible to the user in IE, but not to the ClickOnce bootloader.</p>
<p>The second situation is if your domain credentials are for some reason not good enough.&nbsp; There are cases where the domain needs to be fully specified for the authentication to succeed. For example, I may log in as DOMAIN1\Brian, but in order to properly authenticate with the server, I need to provide my name as <a href="mailto:brian@DOMAIN1.subdomain.mycompany.com">brian@DOMAIN1.subdomain.mycompany.com</a>, giving the fully qualified domain name.&nbsp; Why is this?&nbsp; I have not bothered to find out,&nbsp;it is some problem with how the domains authenticate with each other. However it is definitely annoying and does not seem consistent.</p>
<p>To summarize these limitations let me say that ClickOnce will work in the following cases:&nbsp;no authentication, custom application authentication (not officially supported) or NTLM authentication.&nbsp; I was really disappointed by this because in my situation, there is no work around.&nbsp; The users will not be using domain joined machines, and I cannot give open access to the SharePoint deployment site due to IP requirements and company policy (obvious).&nbsp; Likewise, custom authentication methods (or the HTTP proxy solution suggested by the article) are just not adequate.&nbsp;&nbsp;Anything non-standard or less than secure is just not an&nbsp;answer to&nbsp;be considered.&nbsp;</p>
<p>The article below talks about the authentication mechanisms used and possible work-arounds to authentication issues:</p>
<p><a href="https://msdn2.microsoft.com/en-us/library/aa480721.aspx" mce_href="https://msdn2.microsoft.com/en-us/library/aa480721.aspx">https://msdn2.microsoft.com/en-us/library/aa480721.aspx</a></p>
<p>For now, I'm going to have to deploy my application as a traditional MSI package and implement an updater to keep the client machines up to date as new versions of the software package is created.&nbsp; This will probably involve using the Updater Application Block.</p>
<p mce_keep="true">&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>Patterns-based frameworks for .NET</title>
      <link>https://docs.microsoft.com/archive/blogs/brianwehrle/patterns-based-frameworks-for-net</link>
      <pubDate>Fri, 20 Oct 2006 12:56:00 GMT</pubDate>
      <dc:creator><![CDATA[MSDN Archive]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/brianwehrle/2006/10/20/patterns-based-frameworks-for-net/</guid>
      <description><![CDATA[With the first major project that I worked on .NET for a private company, I realize that we would...]]></description>
      <content:encoded><![CDATA[<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><SPAN lang=EN-GB style="mso-ansi-language: EN-GB"><FONT size=3><FONT face="Times New Roman">With the first major project that I worked on .NET for a private company, I realize that we would have benefited from having richer, deeper patterns for doing the development that would have served as a guideline when trying to tackle such important issues as testability and maintainability.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>In .NET, many programmers are coming aboard from the Visual Basic camp and are therefore using the same programming methods as before, without the advantage of patterns-based design with specific, goal orientated designs (testability, componentization, ease of configuration, for example).<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><SPAN lang=EN-GB style="mso-ansi-language: EN-GB"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><SPAN lang=EN-GB style="mso-ansi-language: EN-GB"><FONT face="Times New Roman" size=3>This leads to VB6-style programming in the modern environment of .NET 2.0; the quick and dirty apps, some simple and fast data-binding vis a vis a few clicks, and then done.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>This works fine, up until a certain point, which is usually the dividing line between a small project with a short life span and a large one.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Visual Studio for .NET started off better than Java’s initial offerings and has offered better WSIWYG graphical builder, which is a real seller for doing quick work, part of the reason VB6 became so popular.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>On the other hand, Java has a head start design-wise on .NET with their Swing toolkit, and the accomplished programmer steeped in more enterprise-grade development will probably find themselves more at home in a Java environment than in a .NET one, at least as far as User Application programming is concerned.</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><SPAN lang=EN-GB style="mso-ansi-language: EN-GB"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><SPAN lang=EN-GB style="mso-ansi-language: EN-GB"><FONT size=3><FONT face="Times New Roman">The Microsoft Patterns and Practices group has developed Application Blocks which provide exactly this type of rich, deep functionality that provides the basis for enterprise-class applications.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Furthermore, the application Guidance&nbsp;Explorer brings enterprise-level intelligence to a small software firm that most shops would never have access to “in build”, along with the rest of their Visual Studio development tools.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>It is a great package, and freely available.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN></FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><SPAN lang=EN-GB style="mso-ansi-language: EN-GB"><FONT size=3><FONT face="Times New Roman"><SPAN style="mso-spacerun: yes"></SPAN></FONT></FONT></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><SPAN lang=EN-GB style="mso-ansi-language: EN-GB"><FONT size=3><FONT face="Times New Roman"><SPAN style="mso-spacerun: yes"></SPAN>Since I’ve been working with, I’m going to be writing several articles about using different components from Patterns and Practices to create applications, and discuss implementation and design questions when using these frameworks.<o:p></o:p></FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><SPAN lang=EN-GB style="mso-ansi-language: EN-GB"><o:p><FONT face="Times New Roman" size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><SPAN lang=EN-GB style="mso-ansi-language: EN-GB"><FONT size=3><FONT face="Times New Roman">You can find the home page for Patterns and Practices here:<o:p></o:p></FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><SPAN lang=EN-GB style="mso-ansi-language: EN-GB"><A href="https://msdn.microsoft.com/practices/"><FONT face="Times New Roman" size=3>https://msdn.microsoft.com/practices/</FONT></A><o:p></o:p></SPAN></P>]]></content:encoded>
    </item>
  </channel>
</rss>