La forma más segura (es decir, la manera más fácil de no cometer un error en su aplicación) podría ser la siguiente.
Hacer una interfaz que abstrae el uso de TFS, por ejemplo:
interface ITfs
{
bool checkout(string filename);
}
Escriba una clase que implementa esta interfaz utilizando TFS:
class Tfs : ITfs
{
public bool checkout(string filename)
{
... code here which uses the TFS assembly ...
}
}
escribir otra clase que implementa esta interfaz sin necesidad de utilizar TFS:
class NoTfs : ITfs
{
public bool checkout(string filename)
{
//TFS not installed so checking out is impossible
return false;
}
}
Tiene un singleton en alguna parte:
static class TfsFactory
{
public static ITfs instance;
static TfsFactory()
{
... code here to set the instance
either to an instance of the Tfs class
or to an instance of the NoTfs class ...
}
}
Ahora sólo hay un lugar que tiene que tener cuidado (es decir, el constructor TfsFactory); el resto de su código puede invocar los métodos ITfs de su TfsFactory.instance sin saber si TFS está instalado.
Para responder a los comentarios recientes indican a continuación:
Según mis pruebas (no sé si este es el comportamiento definido ') se produce una excepción cuando (tan pronto como sea) se llama a un método que depende del ensamblaje que falta. Por lo tanto, es importante encapsular su ensamblado code-which-depends-on-the-missing en al menos un método separado (o una clase separada) en su ensamblaje.
Por ejemplo, lo siguiente no se cargará si el ensamblaje de conversación es que falta:
using System;
using OptionalLibrary;
namespace TestReferences
{
class MainClass
{
public static void Main(string[] args)
{
if (args.Length > 0 && args[0] == "1") {
Talk talk = new Talk();
Console.WriteLine(talk.sayHello() + " " + talk.sayWorld() + "!");
} else {
Console.WriteLine("2 Hello World!");
}
}
}
}
la siguiente carga voluntad:
using System;
using OptionalLibrary;
namespace TestReferences
{
class MainClass
{
public static void Main(string[] args)
{
if (args.Length > 0 && args[0] == "1") {
foo();
} else {
Console.WriteLine("2 Hello World!");
}
}
static void foo()
{
Talk talk = new Talk();
Console.WriteLine(talk.sayHello() + " " + talk.sayWorld() + "!");
}
}
}
Estos son los resultados de la prueba (utilizando MSVC# 2010 y .NET en Windows):
C:\github\TestReferences\TestReferences\TestReferences\bin\Debug>TestReferences.exe
2 Hello World!
C:\github\TestReferences\TestReferences\TestReferences\bin\Debug>TestReferences.exe 1
Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'OptionalLibrary, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
at TestReferences.MainClass.foo()
at TestReferences.MainClass.Main(String[] args) in C:\github\TestReferences\TestReferences\TestReferences\Program.cs:
line 11
C:\github\TestReferences\TestReferences\TestReferences\bin\Debug>
"TFS" en este caso es "Team Foundation System", ¿verdad? –
Sí, pero considero que la pregunta es menos sobre TFS y más con la mejor manera de hacer referencia a ensamblajes que pueden no estar presentes en algunas máquinas de usuarios. – Justin
D'oh, no leí la primera oración con cuidado, así que no me di cuenta de que con 'opcional' querías decir 'puede que no esté presente en la máquina del usuario'. –