multiple hint paths in csproj file from an text file variable

烈酒焚心 提交于 2019-12-01 10:48:39

"Can i declare a variable in a text file say type1 and import that text file in my csproj file and assign the appropriate reference to my application ?"

Isn't that exactly what I describe in the blog post you link to?

Look for the defined variable 'SomeProject' in the configuration file 'ProjectReferences.txt' which I load from the .csproj file.

ProjectReferences.txt

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="$(Configuration) == 'Debug With Project References'">
    <SomeProject>..\SomeProject</SomeProject>
  </PropertyGroup>
</Project>

.csproj file

<Import Project="..\ProjectReferences.txt" />
<Choose>
  <When Condition="Exists($(SomeProject))">
    <ItemGroup>
      <ProjectReference Include="$(SomeProject)\SomeProject.csproj">
        <Project>{6CA7AB2C-2D8D-422A-9FD4-2992BE62720A}</Project>
        <Name>SomeProject</Name>
      </ProjectReference>
    </ItemGroup>
  </When>
  <Otherwise>
    <ItemGroup>
      <Reference Include="SomeProject">
        <HintPath>..\Libraries\SomeProject.dll</HintPath>
      </Reference>
    </ItemGroup>
  </Otherwise>
</Choose>

You need to load the correct DLL during the startup of your application, before .Net loads it for you. NET will load the default DLL as soon as an instance of that class is created. So make sure to load the proper DLL first before you access the properties. Make sure you do not access these properties in the initial class anywhere as .Net will load it then.

Something like this:

class Program
{
    static void Main(string[] args)
    {
        //var configValue = XDocument.Parse("<config><hardware>type1</hardware></config>").Document.Descendants("hardware").First().Value;
        var configValue = XDocument.Load("MyXmlConfig.xml").Document.Descendants("hardware").First().Value;
        if (configValue == "type1")
        {
            System.Reflection.Assembly.LoadFile(@"C:\TEMP\MyAssembly_Type1.dll");
        }
        else if (configValue == "type2")
        {
            System.Reflection.Assembly.LoadFile(@"C:\TEMP\MyAssembly_Type2.dll");
        }

        MyRepositoryClass.Initialize();
    }
}

static class MyRepositoryClass
{
    public static void Initialize()
    {
        var variable1 = MyAssembly.MyRepository.Variable1;
        var variable2 = MyAssembly.MyRepository.Variable2;
        var variable3 = MyAssembly.MyRepository.Variable3;
    }
}

Alternative load the DLL on demand (when .Net asks for it):

class Program
{
    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

        MyRepositoryClass.Initialize();
    }

    private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        if (args.Name.Contains("MyAssembly")) //Put in the name of your assembly
        {
            //var configValue = XDocument.Parse("<config><hardware>type1</hardware></config>").Document.Descendants("hardware").First().Value;
            var configValue = XDocument.Load("MyXmlConfig.xml").Document.Descendants("hardware").First().Value;
            if (configValue == "type1")
            {
                return System.Reflection.Assembly.LoadFile(@"C:\TEMP\MyAssembly_Type1.dll");
            }
            else if (configValue == "type2")
            {
                return System.Reflection.Assembly.LoadFile(@"C:\TEMP\MyAssembly_Type2.dll");
            }
        }
        return null;
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!