Scott Hanselman

Hanselminutes Podcast 59 - Hanselminutiae #3

April 13, 2007 Comment on this post [3] Posted in Podcast
Sponsored By

My fifty-ninth podcast is up. Carl and Scott discuss the weeks events in their technology lives, in this 3rd Hanselminutiae. Who are the Spyware People? Is the AppleTV any good? What's your backup strategy? And Scott's Dad gets a Mac.

ACTION: Please vote for us on Podcast Alley! Digg us at Digg Podcasts!

Subscribe: Feed-icon-16x16 Subscribe to my Podcast in iTunes

Do also remember the complete archives are always up and they have PDF Transcripts, a little known feature that show up a few weeks after each show.

Telerik is our sponsor for this show.

Telerik is a new sponsor. Check out their UI Suite of controls for ASP.NET. It's very hardcore stuff. One of the things I appreciate about Telerik is their commitment to completeness. For example, they have a page about their Right-to-Left support while some vendors have zero support, or don't bother testing. They also are committed to XHTML compliance and publish their roadmap. It's nice when your controls vendor is very transparent.

As I've said before this show comes to you with the audio expertise and stewardship of Carl Franklin. The name comes from Travis Illig, but the goal of the show is simple. Avoid wasting the listener's time. (and make the commute less boring)

  • The basic MP3 feed is here, and the iPod friendly one is here. There's a number of other ways you can get it (streaming, straight download, etc) that are all up on the site just below the fold. I use iTunes, myself, to listen to most podcasts, but I also use FeedDemon and it's built in support.
  • Note that for now, because of bandwidth constraints, the feeds always have just the current show. If you want to get an old show (and because many Podcasting Clients aren't smart enough to not download the file more than once) you can always find them at http://www.hanselminutes.com.
  • I have, and will, also include the enclosures to this feed you're reading, so if you're already subscribed to ComputerZen and you're not interested in cluttering your life with another feed, you have the choice to get the 'cast as well.
  • If there's a topic you'd like to hear, perhaps one that is better spoken than presented on a blog, or a great tool you can't live without, contact me and I'll get it in the queue!

Enjoy. Who knows what'll happen in the next show?

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook bluesky subscribe
About   Newsletter
Hosting By
Hosted on Linux using .NET in an Azure App Service

Fusion Loader Contexts - Unable to cast object of type 'Whatever' to type 'Whatever'

April 13, 2007 Comment on this post [2] Posted in Learning .NET | Programming
Sponsored By

It's funny how things you don't think about for a long time appear in twos or threes. This issue came up at work twice recently, and once via an email from a blog reader.

I blogged about part of this in 2004 when we were dealing with a lot of the icky complexities of the Loader (Fusion) in .NET. We used Mike Gunderloy's 2003 Binding Policy Article an a lot of testing to figure out how Fusion worked for us. We also are HUGE fans of Richard Grimes' amazing Fusion Workshop as a resource. Also, I just keep Fusion logging (FORCELOG) turned on all the time and logging to c:\fusionlogs.

Anyway, the issue was this error message about an InvalidCastException: 

System.InvalidCastException was unhandled
Message="Unable to cast object of type 'Plugin.Person' to type 'Plugin.Person'."
Source="LoaderContextSample"
StackTrace:
at LoaderContextSample.Program.Main(String[] args) in C:\LoaderContextSample\Program.cs:line 29
at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

This can be initially very confusing because it says it's trying to cast type Person to type Person. Why aren't Person and Person the same, eh, Person?

Suzanne Cook puts it best, emphasis mine:

For example, path matters when determining whether a type is castable to another type. Even if the assemblies containing the types are identical, if they're loaded from different paths, they're considered different assemblies and therefore their types are different. This is one reason why using contexts other than the Load context is risky. You can get into situations where the same assembly is loaded multiple times in the same appdomain (once in the Load context, once in the LoadFrom context, and even several times in neither context), and their corresponding types won't be castable.

If you have an assembly you reference, but you also have a plugin that you've loaded, perhaps via LoadFrom (bad), if you intend for the types to be the same but they are loaded from different paths, they are effectively different types.

In this sample, I create a Person object via an assembly I've referenced the usual way, via Add Reference. Works great.

Then I load Person using Assembly.Load and create a Person via Reflection, then cast the object instance to the first kind of Person. Because I used Assembly.Load - usually the most appropriate Binding Context - the Loader (Fusion) finds the same assembly, and the Person Type created via Reflection is the same kind of Person as before. Works great. Note that Assembly.Load takes an Assembly Qualified Name like "Person" - not "Person.dll." Remember that Assembly QNs NEVER have .dll in their names.

Then I load the Person from a different path. In this example I've copied Person.dll to Person2.dll via a Post-Build-Event to illustrate this, but the most common way this would happen is that you've got a static reference to an assembly in the GAC, but your Plugin design uses LoadFrom to load a DLL from another path. Then you try to cast them. LoadFrom will almost always lead you astray.

If I was really serious I should have used the complete Assembly QN: Person, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, and I would have strong named it for Assembly verification purposes, but that's another post.

Here's part of the sample:

Person p = new Person("Franklin", "Ajaye");

//Use the Load Context...almost ALWAYS the right thing to do...
Assembly a = Assembly.Load("Person"); 
Type t = a.GetType("Plugin.Person");
object instance = t.InvokeMember(String.Empty,BindingFlags.CreateInstance, null, null, null);
Person p1 = (Person)instance;

//Use the LoadFrom...almost ALWAYS the *WRONG* thing to do...
Assembly a2 = Assembly.LoadFrom(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Person2.dll"));
Type t2 = a2.GetType("Plugin.Person");
object instance2 = t2.InvokeMember(String.Empty,BindingFlags.CreateInstance, null, null, null);
Person p2 = (Person)instance2; //BOOM!

Lucky Line 13 is where the InvalidCastException happens and I see the dialog pictured at the top of this post. Boom.

The Loader has a  lot of nuance, and it's helpful if you're building a large system with plugins and many points of extensibility to ask yourself - Where are my plugins on disks? What Types are shared? How are my plugins getting into memory?

Here's what we documented a long time ago. This only applies to dynamically loaded assemblies:

  • Assemblies will only EVER be loaded from the GAC based on a full bind (name, version, and public key token).  A partial bind with name and public key token only WON’T load from the GAC. 
    • If you reference an assembly with VS.NET you're asking for a full bind. If you say Assembly.Load("foo") you're asking for a partial bind.
  • However, the way this usually works is…
    • You do a partial bind on assembly name, or name and public key token with Assembly.Load
    • Fusion (the code name for the Assembly Loader/Binder) starts walking the probing path looking for an assembly that matches the partial bind.
    • Counter Intuitive: If it finds one while probing (the first one) it will then attempt to use the strong name of the one it found to do a full bind against the GAC.
    • If it’s in the GAC, that’s the one that gets loaded.
    • Any of that loaded assemblies will try to load from the GAC first without going to the probing path, since the embedded references constitute a full bind.
    • If they aren’t found in the GAC, then it will start probing.
    • It’ll grab the first one it finds in the probing path.  If the versions don’t match, Fusion fails.  If they do match, Fusion loads that one.
    • So, if you specify a partial name, and the file is in the GAC, but not the probing path, the load fails, since there’s no way to do a full bind.  

Here's the complete sample code from above if you like.

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook bluesky subscribe
About   Newsletter
Hosting By
Hosted on Linux using .NET in an Azure App Service

Team Hanselman and Diabetes Walk 2007

April 12, 2007 Comment on this post [18] Posted in Diabetes
Sponsored By

I'm here to ask you a personal favor, Dear Reader.

Please Donate to Team Hanselman and help us reach our Goal of raising $50,000 to Fight Diabetes...

...during this year's Step Out to Fight Diabetes by the American Diabetes Association.

This is a technical blog, but I'm not just a technical person full of source code and pomposity.

Two months before my 21st birthday I started peeing a lot. A LOT. Like I was drinking four 2-liter bottles of Sprite a day and was still thirsty beyond belief. We'd just had a family photo taken and I was 130lbs on a 5'11" frame (for those of you outside the US, that's thin.) I was wasting away and looked like death. My father, a Portland Firefighter and Paramedic for thirty years smelled the sugar on my breath and sent me right away to the hospital where my blood glucose level was higher than the meter could read...and it's supposed to be under 100mg/dl.

I spent that spring learning how to give myself shots, four a day, along with a regiment of pills. Twelve years later I have no side effects, knock on wood. Not everyone is that lucky. I recently went to a funeral of a high-school friend who was the exact same age and succumbed to Type 1 Diabetes.

I currently take three shots a day of Symlin while also wearing an Insulin Pump 24-hours a day, even while I sleep. The pump saves me from an additional six shots a day, which I took for 8 years before the pump. I test my blood sugar by pricking my finger between 8 and 10 times a day - that's about 46,500 finger pricks so far, and miles to go before I sleep.

I consider myself lucky though. My 91-year old grandmother's neighbor friend in the 1920's, before Insulin was widely used (it was discovered in 1921) ate nothing but lettuce and eventually died in childhood. I have friends who have been diabetic for nearly 50 years and had to boil large-gauge needles on the stove before injecting themselves with Pork-derived insulin, basing their decisions on a once-a-day urine check to check their blood glucose level.

Diabetes is endemic. Here's some stats from the NIH:

  • Total: 20.8 million people—7 percent of the population—have diabetes.
    • Diagnosed: 14.6 million people
    • Un-diagnosed: 6.2 million people
  • 1.5 million new cases of diabetes were diagnosed in people aged 20 years or older in 2005.
    • Diabetes was the sixth leading cause of death listed on U.S. death certificates in 2002.
  • Diabetes is the leading cause of new cases of blindness among adults aged 20 to 74 years.
  • Diabetes is the leading cause of kidney failure, accounting for 44 percent of new cases in 2002.
  • About 60 to 70 percent of people with diabetes have mild to severe forms of nervous system damage.

I tell you this not to scare you, or ask for pity. I tell you this because it's the painful truth. It sucks, and it sucks big time. I am constantly and consistently afraid that my son will face this disease in his lifetime. God help the children who get Type 1 diabetes. I was hardly prepared at 21, I can just now begin to imagine what a parent of a 2 or 3 year old would go through after a diagnosis like that. I'm even afraid to say it out loud, it's that unspeakable.

If you aren't familiar with Diabetes, perhaps my explanation on how Diabetes works using an analogy of an Airplane and the above statistics will help you understand how personally painful this disease is.

The Goal

This year Team Hanselman, led by myself and my wife, Mo, who had this whole idea, will be walking to fight diabetes on Oct 20h, 2007. We have set a goal of raising US$50,000. Crazy, huh?

If only 2500 of you, dear readers, gave US$20 to this cause, we've met our Team Goal. If only 1000 give US$50, well, you get the idea. If you can't donate, that's OK. Post about this on your blog, spread the URL http://www.hanselman.com/fightdiabetes or put some of our Diabetes "Flair" on your site!

Last year this time, there were over 5000 people subscribing to this blog (for the technical content, I assume) - this year there are over 14,000.

A Personal Favor to Me

Perhaps you've Googled and found my blog useful in the past or you've seen me speak at a conference or local user's group. Or, you've hung out here for years (this blog started in April 2002!). Maybe you're a blogger yourself and use DasBlog. Perhaps you've visited my Blog Archives and found them useful, or you read the ASP.NET 2.0 book.

If you've ever thought about giving a 'tip' to this blog, here's your chance to make that tip tax-deductible! (if you're in the US) You can also paypal your donation to the email address that is "my first name at my last name .com" and I will personally deliver 100% of your money myself.

Donate Now

Donations are Tax-Deductible and go directly to the ADA. If you like, you can PayPal me and I'll deliver the money myself.

Team Hanselman Diabetes "Blog Flair" and Badges

Please feel free to spread this flair or post them on your blog, and link them to this easy to remember link: http://www.hanselman.com/fightdiabetes. It'll bring folks right here to this site.

 

If you want to create a better flair, like the one that Jon Galloway created, send it to me, or put a link in the comments and I'll add it to this page for others to use!

LINKING NOTE: http://www.hanselman.com/fightdiabetes brings you here, and http://www.hanselman.com/fightdiabetes/donate takes you straight to the donation site.

Thanks for your patient attention, we now return you to our regular blogging schedule.

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook bluesky subscribe
About   Newsletter
Hosting By
Hosted on Linux using .NET in an Azure App Service

New Technology Podcast - RunAs Radio with Greg Hughes and Richard Campbell

April 12, 2007 Comment on this post [1] Posted in Podcast
Sponsored By

Happy 40th Birthday to Greg Hughes.

To celebrate his birthday, go checkout his new Podcast with Richard Campbell called RunAs Radio.

As with all Pwop shows, the audio quality will be excellent. Richard says:

I did get a fancy new recording rig to make all this work. My broadcast mike plugs into a MOTU Traveller that uses Firewire into Terrance, my 4960x1600 x64 XP beast. Also plugged into the MOTU is a Telos ONE+ONE for capture two telephone lines: one for Greg, and one for the guest. So I record my channel, Greg's phone track and the guest. Greg also does a local recording of himself (maximum quality, of course) and then all that is combined to make a show.

And Greg used my Samson Mic, Stand and Spit Pop Filter. Greg says:

It's a weekly IT podcast with a Microsoft technologies focus. Richard and I will discuss all sorts of relevant topics with a variety of smart and interesting people.

I have a great deal of respect for both Greg and Richard. They are both deeply technical and well-versed on a huge number of topics that the IT community cares about, and Greg also has a very strong security focus as our Chief Security Executive here at Corillian. I'll definitely be listening to this show on my drive home.

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook bluesky subscribe
About   Newsletter
Hosting By
Hosted on Linux using .NET in an Azure App Service

Fix: "General Failure" while launching FireFox URLs from Outlook

April 12, 2007 Comment on this post [9] Posted in Musings
Sponsored By

There seems to be an ongoing chaotic series of bugs, or bug, around "Set as Default Browser" and FireFox. Recently I updated my FireFox to 2.0.0.3 and suddenly whenever I click on a URL in Outlook I get a message box with "General Failure." Occasionally I'll get a "Locate Link Browser" message as well.

The issue seems to be some of the old Windows DDE stuff where a DDE message is sent to an application after it started up to pass information - in this case, the URL. Today, we prefer to pass the URL on the command line. It also makes for a faster launch.

Even though this was a problem with FireFox 0.9, it's still happening today. (I'm not the only one). John Haller has a fix in the form of a Registry File.

You can also make the change yourself in the Explorer UI via Tools|Options|FileTypes. Go to the ones marked (NONE) and start with URL:HyperText...and go to Advanced, then Edit the Open action and clear out the DDE Message TextBox.

Unrelated Aside: John's even got a theme and tools and hacks to make FireFox 2 look like IE. Stunning.

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook bluesky subscribe
About   Newsletter
Hosting By
Hosted on Linux using .NET in an Azure App Service

Disclaimer: The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.