.net 我可以将可移植类库中的类或方法限制为特定平台吗?

.net 我可以将可移植类库中的类或方法限制为特定平台吗?,.net,portable-class-library,.net,Portable Class Library,我正在创建一个可移植类库,目标是.NET4.5、Windows8、WindowsPhone8.1和WindowsPhoneSilverlight8 我可以将类或方法限制为特定的目标吗?方法只能从.Net 4.5项目调用,而不能从Windows Phone 8.1项目调用 这可能吗?是的,通过使用指定这些平台的指令。现在我不完全确定是否有一个.NET4.5指令自动可用,但据我所知,有 #SILVERLIGHT、#WINDOWS#U PHONE、#WP8和#NETFX#U CORE指令可用 您可以这

我正在创建一个可移植类库,目标是.NET4.5、Windows8、WindowsPhone8.1和WindowsPhoneSilverlight8

我可以将类或方法限制为特定的目标吗?方法只能从.Net 4.5项目调用,而不能从Windows Phone 8.1项目调用


这可能吗?

是的,通过使用指定这些平台的指令。现在我不完全确定是否有一个.NET4.5指令自动可用,但据我所知,有

#SILVERLIGHT
#WINDOWS#U PHONE
#WP8
#NETFX#U CORE
指令可用

您可以这样使用它们:

#if WINDOWS_PHONE
   int x = 1;
# else
   int x = 2;
#endif
在您的情况下,您会将它们放在方法的周围,这样只有在针对正确的项目时,才能编译该方法

我相信
#NETFX_CORE
只表明它是Windows8而不是.NET。可能存在特定于.NET的指令,但它们不会自动为您引用的项目设置(可能是因为这些指令使用WinRT,而不是.NET per sé)

但是,表示可以使用自定义指令进行设置:

<DefineConstants Condition=" '$(TargetFrameworkVersion)' == 'v4.0' ">
    RUNNING_ON_4
</DefineConstants>

在4上运行
这是可行的

例如,您可以使用上下文绑定来注入适当的类型实现,以便此方法调用不会执行任何操作,而另一个实现将执行预期的操作

public abstract class MyBaseClass {
    public abstract void MyMethod() { }
}

public class MyDerivedDotNet45Class : MyBaseclass() {
    public override void MyMethod() { // Does something... }
}

public class MyDerivedWindowsPhoneClass : MyBaseClass() {
    public override void MyMethod() { // Does nothing... }
}

public class MyWorkingProcessClass {
    public MyWorkingProcessClass(MyBaseClass baseClass) {
        dependency = baseClass;
    }

    public void MethodThatShallDoSomethingOnlyWhenDotNet45() {
        dependency.MyMethod();
    }

    private readonly MyBaseClass dependency;
}
因此,根据您注入的类,您的程序要么执行某些操作,要么不执行任何操作

在.Net 4.5下

var workingClass = new MyWorkingProcessClass(new MyDerivedDotNet45Class());
wokringClass.MethodThatShallDoSomethingOnlyWhenDotNet45();
这将完成派生类中所述的操作

在Windows Phone下

var workingClass = new MyWorkingProcessClass(new MyDerivedWindowsPhoneClass());
workingClass.MethodThatShallDoSomethingOnlyWhenDotNet45();
这与派生类中的规定无关

使用Ninject

提供了一个很好的使用示例


这是因为你应该构建你的对象组合,这样它就知道在什么地方和什么时候注入什么。

这与PCL项目的要点背道而驰。如果你要强迫自己创建单独的构建,那就不用麻烦了。所以我不能只编译一次库,然后一直使用它?我是否必须将源项目包含到我要使用此库的每个项目中?不,使用这些指令只能编译一次。