Got an answer from Kentico support. They fixed my loader class as follows:
[ECommerceModuleLoader]
public partial class CMSModuleLoader
{
private class ECommerceModuleLoader : CMSLoaderAttribute
{
public ECommerceModuleLoader()
{
// Require E-commerce module to load properly
RequiredModules = new string[] { ModuleEntry.ECOMMERCE };
}
public override void Init()
{
TaxClassInfoProvider.ProviderObject = new FranchiseTaxClassInfoProvider();
}
}
}
I had changed the outermost class name without understanding that wouldn't work. The whole point is to extend the CMSModuleLoader class. Seems obvious in retrospect.
Thanks for the help and hope this discussion helps someone else.