7

An almost similar question has already been asked a while ago but not answered yet. And since my setup is a little different, I start a new try:

I demonstrate a shortened version of my code, but even this short version produces the error.

I have a method that returns an instance of a System.Printing.LocalPrintServer:

public class PrintServerProvider
{
    public LocalPrintServer Provide()
    {
        return new LocalPrintServer(new string[0], PrintSystemDesiredAccess.EnumerateServer);
    }
}

For this method I implemented a unit test using shims:

[TestClass]
public class PrintServerProviderTests
{
    [TestMethod]
    public void Provide_Success()
    {
        using (ShimsContext.Create())
        {
            bool constructorCalled = false;
            ShimLocalPrintServer.ConstructorStringArrayPrintSystemDesiredAccess = (instance, props, access) =>
            {
                constructorCalled = true;
            };

            PrintServerProvider provider = new PrintServerProvider();
            LocalPrintServer server = provider.Provide();
            Assert.IsNotNull(server);
            Assert.IsTrue(constructorCalled);
        }
    }
}

In Visual Studio 2013 this test works fine.
But in Visual Studio 2015 (Update 1), when the tested method calls new LocalPrintServer(...) an

InvalidProgramException at System.Printing.LocalPrintServer..ctor(String[] propertiesFilter, PrintSystemDesiredAccess desiredAccess) at DemoProject.PrintServerProvider.Provide() in C:\Projects\DemoProject\Program.cs:Line 10. ...

is raised. (The normal productive call works fine. The exception is only raised when running the test method)

The referenced assemblies are:

  • System.Printing (v4.0.30319) from C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5\System.Printing.dll
  • System.Printing.4.0.0.0.Fakes
  • Microsoft.QualityTools.Testing.Fakes (v2.0.50727) from C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\PublicAssemblies\Microsoft.QualityTools.Testing.Fakes.dll

System.Printing.Fakes

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
<Assembly Name="System.Printing" Version="4.0.0.0"/>
  <StubGeneration>
    <Clear/>
  </StubGeneration>
  <ShimGeneration>
    <Clear/>
    <Add FullName="System.Printing.LocalPrintServer!"/>
  </ShimGeneration>
</Fakes>

Both projects (productive and test) use .NET Framework 4.5.

I tried resetting the framework as well as the references. I tried different versions of the referenced assemblies. And I tried 64bit and 32bit in all variations.

In the real code, I use shims of other classes too. LocalPrintServer is the only class where the exception occurs.

Can anybody explain what causes this InvalidProgramException and how to solve it?

I set a bounty on this question, which will probably be solved by the same answer. So feel free to post there too if you think your answer is bounty-worth.

René Vogt
  • 43,056
  • 14
  • 77
  • 99
  • Are you signing/strongnaming assemblies? – Ben Feb 08 '16 at 10:02
  • @Ben `System.Printing` is strong named as it is part of the framework. My own assemblies are not strong named (which is not a problem for Visual Studio 2013) – René Vogt Feb 08 '16 at 10:04
  • 1
    The original question is much more impressive, simply removing an assembly that doesn't get used and never gets loaded fixes the problem. Excessively bizarre. I can also make it fail on VS2013 and the target framework does not matter. Somebody needs to take this to Microsoft, start with connect.microsoft.com – Hans Passant Feb 08 '16 at 18:37

0 Answers0