Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用可选的程序集引用组织代码?_C#_.net_Assemblies - Fatal编程技术网

C# 如何使用可选的程序集引用组织代码?

C# 如何使用可选的程序集引用组织代码?,c#,.net,assemblies,C#,.net,Assemblies,我正在处理一个项目,希望可以选择使用程序集(如果可用)。此程序集仅在WS2008R2上可用,我的理想产品是一个通用的二进制文件,用于有或没有该程序集的计算机。但是,我主要是在Windows 7计算机上开发,无法安装程序集。 我如何组织我的代码,以便在没有程序集的情况下(以最小的更改)在机器上构建代码;其次,我如何确保仅在程序集存在时调用程序集函数。 (注意:可选程序集的唯一用途是实例化库中的类,并重复调用该类的(单个)函数,该函数返回布尔值。该程序集是fsrmlib,它公开WS08R2上的高级文

我正在处理一个项目,希望可以选择使用程序集(如果可用)。此程序集仅在WS2008R2上可用,我的理想产品是一个通用的二进制文件,用于有或没有该程序集的计算机。但是,我主要是在Windows 7计算机上开发,无法安装程序集。
我如何组织我的代码,以便在没有程序集的情况下(以最小的更改)在机器上构建代码;其次,我如何确保仅在程序集存在时调用程序集函数。
(注意:可选程序集的唯一用途是实例化库中的类,并重复调用该类的(单个)函数,该函数返回布尔值。该程序集是fsrmlib,它公开WS08R2上的高级文件系统管理操作。)

我目前正在考虑编写一个包装器类,如果程序集不存在,它将始终返回true。这是正确的方法吗?

将功能隐藏在界面后面,比如:

public interface IFileSystemManager
{
    void Manage(IFoo foo);
}
创建两个实现:

  • 从fsrmlib包装所需功能的实现
  • 不做任何事情的实现
使用构造函数注入将IFileSystemManager注入到使用者中:

public class Consumer
{
    private readonly IFileSystemManager fileSystemManager;

    public Consumer(IFileSystemManager fileSystemManager)
    {
        if (fileSystemManager == null)
        {
            throw new ArgumentNullException("fileSystemManager");
        }

        this.fileSystemManager = fileSystemManager;
    }

    // Use the file system manager...
    public void Bar()
    {
        this.fileSystemManager.Manage(someFoo);
    }
}
通过将从IFileSystemManager到具体类的映射委托给配置文件,使IFileSystemManager的选择成为配置选项,这样您就可以在不重新编译应用程序的情况下更改实现

将运行在WS 2008 R2上的应用程序配置为使用包装fsrmlib的实现,并将所有其他应用程序配置为使用空对象实现

我建议您为配置部分使用DI容器,而不是自己滚动此功能


可选地,你也可以考虑将IFLeSeSeMeMe饰件作为一个外接程序来处理,并使用它来为你提供信息。

隐藏界面后面的功能,比如说:

public interface IFileSystemManager
{
    void Manage(IFoo foo);
}
创建两个实现:

  • 从fsrmlib包装所需功能的实现
  • 不做任何事情的实现
使用构造函数注入将IFileSystemManager注入到使用者中

public class Consumer
{
    private readonly IFileSystemManager fileSystemManager;

    public Consumer(IFileSystemManager fileSystemManager)
    {
        if (fileSystemManager == null)
        {
            throw new ArgumentNullException("fileSystemManager");
        }

        this.fileSystemManager = fileSystemManager;
    }

    // Use the file system manager...
    public void Bar()
    {
        this.fileSystemManager.Manage(someFoo);
    }
}
通过将从IFileSystemManager到具体类的映射委托给配置文件,使IFileSystemManager的选择成为配置选项,这样您就可以在不重新编译应用程序的情况下更改实现

将运行在WS 2008 R2上的应用程序配置为使用包装fsrmlib的实现,并将所有其他应用程序配置为使用空对象实现

我建议您为配置部分使用DI容器,而不是自己滚动此功能


另外,您也可以考虑将IFLeSeSeMeMe饰件作为一个外接程序来处理,并使用它来为您提供信息。

< P>我的方法是动态加载程序集,而不是硬编码引用。然后,您的代码可以决定是使用程序集(如果已加载)还是返回其他值。如果使用程序集,则需要使用反射来实例化该类并使用该方法。这样,您的代码将在任何平台上构建和运行,但如果它检测到存在
fsrmlib
,其行为将发生变化


System.Reflection.Assembly文档已经发布。

我的方法是动态加载程序集,而不是硬编码引用。然后,您的代码可以决定是使用程序集(如果已加载)还是返回其他值。如果使用程序集,则需要使用反射来实例化该类并使用该方法。这样,您的代码将在任何平台上构建和运行,但如果它检测到存在
fsrmlib
,其行为将发生变化


System.Reflection.Assembly文档具有。

如果动态加载引用,那么使用引用的代码将如何编译?编译器应该知道引用中是否存在类。如果动态加载引用,那么使用引用的代码将如何编译?编译器应该知道引用中是否存在类。我当前的方法与您描述的方法类似,函数返回的布尔值用于决定是否应该执行某些操作(因此,每当FSRM不存在时,我都返回true)。至于使用配置文件,我希望以某种方式动态检测库的存在。我当前的方法与您描述的方法类似,函数返回的布尔值用于决定是否应执行某些操作(因此,每当FSRM不存在时,我将返回true)。至于使用配置文件,我希望以某种方式动态检测库的存在。