我正在尝试编写一些在结构上设置属性的代码(重要的是它是结构上的属性)并且它失败了:
System.Drawing.Rectangle rectangle = new System.Drawing.Rectangle();
PropertyInfo propertyInfo = typeof(System.Drawing.Rectangle).GetProperty("Height");
propertyInfo.SetValue(rectangle, 5, null);
Run Code Online (Sandbox Code Playgroud)
高度值(由调试器报告)永远不会设置为任何值 - 它保持默认值0.
我之前已经对课程进行了大量的反思,但这种方法运行良好.另外,我知道在处理结构时,如果设置字段,则需要使用FieldInfo.SetValueDirect,但我不知道PropertyInfo的等效项.
我的电脑上安装了 Visual Studio 17.5.3,其 iOS 版本为 Xamarin.iOS 和 Xamarin.Mac SDK 16.2.0.5。
我连接到运行 Ventura 13.3.1 和 XCode 14.3 的 Mac。
当我尝试从 PC 上的 Visual Studio 进行部署时,出现以下错误:
错误 HE0004:无法加载框架“ContentDeliveryServices”(路径:/Applications/Xcode.app/Contents/SharedFrameworks/ContentDeliveryServices.framework/ContentDeliveryServices):
我相信这与 Visual Studio 与 XCode 14.3 不兼容有关,因为我升级了 Mac,这个问题开始发生,但我还没有确定这是否是 14.2,因为安装需要很长时间。
我将尝试安装 14.2 看看它是否可以解决这个问题,但与此同时(以及未来的读者)有人有解决这个问题的方法吗?
请注意,HE0004 错误确实出现在其他在线帖子中,但我还没有找到任何提及此特定文件的帖子。他们似乎提到了DVTITunesSoftwareServiceFoundation,解决方案也是降级 XCode。
我正在开发一个我们称之为Container的项目.Container有一堆EmbeddedResources.这些EmbeddedResources的原始文件是另一个我们称之为FileProject的项目.
FileProject是一个目前由一组不同开发人员处理的项目,并且总是在变化,因此我将EmbeddedResource文件链接起来 - 这样每当原始项目发生变化并且我重建项目时,它就会获取更改.
只要文件发生更改,此设置就会捕获,但只要在项目中添加或删除新文件,它就不会捕获.有没有办法从Visual Studio中的整个文件夹结构中创建EmbeddedResources以捕获文件删除和添加?
我发现在接口和另一个派生类之间插入一个类会导致调用接口的默认实现而不是同一方法的派生实现。这是意料之外的行为。为什么会这样?
我创建了一个重现问题的示例项目:
public interface IPrinterInterface
{
public void PrintIt() => Console.WriteLine("Interface");
}
public class MiddlePrinter : IPrinterInterface{}
public class Printer : MiddlePrinter
{
public void PrintIt() => Console.WriteLine("Class");
}
class Program
{
static void Main(string[] args)
{
var printer = (IPrinterInterface)new Printer();
printer.PrintIt(); // This prints "Interface"
Console.ReadLine(); // so the app sits
}
}
Run Code Online (Sandbox Code Playgroud)
此代码导致Interface被打印出来。
相比之下,如果从继承中移除 MiddlePrinter 类(如下面的代码所示),则代码打印“Class”:
public interface IPrinterInterface
{
public void PrintIt() => Console.WriteLine("Interface");
}
public class Printer : IPrinterInterface
{
public …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个将在特定时间执行操作的应用程序(非常类似于Windows任务计划程序).我目前正在使用Process.Start()来启动任务所需的文件(或exe).
我通过调用文件(.mp3)启动进程,并且该进程启动WMP(因为它是默认应用程序).到现在为止还挺好.现在我要杀死那个过程.我知道在这种情况下,Process.Start(string,string)返回任何内容(C#中为null)是正常的行为.
所以我问我在通过Process.Start(字符串,字符串)调用它时如何关闭WMP?
编辑:
请注意,我没有直接使用Process.Start()打开WMP,这是我运行该过程的行:
VB:Me._procs.Add(Process.Start(Me._procInfo))C#:this._procs.Add(Process.Start(this._procInfo))
_procInfo是ProcessStartInfo实例._procInfo.FileName是"C:\ route\myFile.mp3".这就是WMP开放的原因.在任何情况下,除了返回布尔值的instance-one之外的所有Start()方法都不返回任何内容(C#中为null),因为WMP不是直接创建的进程(请注意WMP运行并且歌确实发挥).
概括
.NET Core 应用程序无法 XML 序列化包含枚举值的对象,而 .NET Framework (4.7.2) 成功。这是一个已知的重大更改,如果是,我该如何解决?
代码示例
以下控制台应用程序不会在 .NET Framework 4.7.2 项目中引发异常:
public enum MyEnum
{
One,
}
public class ValueContainer
{
public object Value;
}
class Program
{
static void Main(string[] args)
{
XmlSerializer newSerializer = XmlSerializer.FromTypes(
new[] { typeof(ValueContainer)})[0];
var instance = new ValueContainer();
instance.Value = MyEnum.One;
using (var memoryStream = new MemoryStream())
{
newSerializer.Serialize(memoryStream, instance);
}
}
}
Run Code Online (Sandbox Code Playgroud)
.NET Core 3.0 控制台应用程序中完全相同的代码在调用时抛出以下异常Serialize:
System.InvalidOperationException
HResult=0x80131509
Message=There was an error generating the XML …Run Code Online (Sandbox Code Playgroud) 我希望XmlSerializer创建的XML如果它们具有默认值,则排除属性.这是可能的XmlSerializer或我将不得不考虑IXmlSerializable?
例如,我可能有以下课程:
public class PositionedObject
{
public float X
{ get; set; }
public float Y
{ get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我想告诉XmlSerializer在序列化PositionedObject的实例时,如果值为0则不包括X(如果为0,则与Y相同).
我创建了一个名为TestMauiApp的新 MAUI .NET 8.0 项目(与 Visual Studio 2022 创建的默认值相比没有任何更改) 。然后,我将一个 MAUI 类库添加到名为MauiLibrary的解决方案中,并将该类库链接到我的项目中。当我在 Azure Pipeline 上构建它时,出现以下错误:
"/Users/runner/work/1/s/TestMauiApp/TestMauiApp.sln" (SignAndroidPackage target) (1) ->
"/Users/runner/work/1/s/TestMauiApp/SkiaGum.Mobile/MauiLibrary.csproj" (SignAndroidPackage target) (3) ->
(_BuildApkEmbed target) ->
/Users/runner/hostedtoolcache/dotnet/packs/Microsoft.Android.Sdk.Darwin/34.0.43/tools/Xamarin.Android.Common.targets(2150,3): error XABBA7009: System.InvalidOperationException: Assembly compression info not found for key '__CompressedAssembliesInfo:/Users/runner/work/1/s/TestMauiApp/SkiaGum.Mobile/MauiLibrary.csproj'. Compression will not be performed. [/Users/runner/work/1/s/TestMauiApp/SkiaGum.Mobile/MauiLibrary.csproj::TargetFramework=net8.0-android]
/Users/runner/hostedtoolcache/dotnet/packs/Microsoft.Android.Sdk.Darwin/34.0.43/tools/Xamarin.Android.Common.targets(2150,3): error XABBA7009: at Xamarin.Android.Tasks.BuildApk.RunTask() [/Users/runner/work/1/s/TestMauiApp/SkiaGum.Mobile/MauiLibrary.csproj::TargetFramework=net8.0-android]
/Users/runner/hostedtoolcache/dotnet/packs/Microsoft.Android.Sdk.Darwin/34.0.43/tools/Xamarin.Android.Common.targets(2150,3): error XABBA7009: at Microsoft.Android.Build.Tasks.AndroidTask.Execute() in /Users/runner/work/1/s/xamarin-android/external/xamarin-android-tools/src/Microsoft.Android.Build.BaseTasks/AndroidTask.cs:line 25 [/Users/runner/work/1/s/TestMauiApp/SkiaGum.Mobile/MauiLibrary.csproj::TargetFramework=net8.0-android]
Run Code Online (Sandbox Code Playgroud)
我无法在任何地方找到有关此问题的信息,因此我不确定从哪里开始解决此问题。
通过将以下行添加到我的MauiLibrary csproj 文件中,我能够克服此错误(或者可能只是将其替换为其他错误)。
<AndroidEnableAssemblyCompression>false</AndroidEnableAssemblyCompression>
Run Code Online (Sandbox Code Playgroud)
通过这样做,我现在得到一个不同的错误:
"/Users/runner/work/1/s/TestMauiApp/TestMauiApp.sln" (SignAndroidPackage target) (1) ->
"/Users/runner/work/1/s/TestMauiApp/SkiaGum.Mobile/MauiLibrary.csproj" (SignAndroidPackage target) …Run Code Online (Sandbox Code Playgroud) 摘要
如果我将.csproj加载到Project实例中,更改磁盘上的.csproj,然后尝试重新加载.csproj(不停止应用程序),我的更改不会显示在新加载的Project实例上,就好像它被缓存在某个地方.
详细步骤
我在MSBuild 14.0中使用Microsoft.Build.Evaluation.Project类.
我按如下方式加载项目:
MyProject = new Project(fileName);
fileName 是我本地计算机上的.csproj文件.
一旦项目加载到内存中,我通过AllEvaluatedItems在监视窗口中进行评估来验证它是否包含一个名为Class2.cs的特定文件,该窗口显示:
"Compile"="Class2.cs" ["Class2.cs"] #DirectMetadata=0 Microsoft.Build.Evaluation.ProjectItem
然后我在文本编辑器中打开.csproj文件,找到Class2的条目:
<Compile Include="Class2.cs" />
接下来,我从.csproj文件中删除此条目(当最初将其加载到Project实例中的应用程序仍在运行时)并保存.csproj文件.
然后我按如下方式卸载并重新加载项目:
MyProject.ProjectCollection.UnloadProject(MyProject);
// call the same code to reload the project from the same .csproj location:
MyProject = new Project(fileName);
最后,我在一个监视窗口中展开新创建的实例的AllEvaluatedItems,我看到Class2再次出现,好像项目没有从磁盘重新加载.
是否存在某种缓存?我是否需要执行其他操作才能从磁盘卸载和重新加载项目?
如果我有一个界面:
interface IMyInterface
{
void DoSomething();
}
Run Code Online (Sandbox Code Playgroud)
还有一个实现类:
class MyClass : IMyInterface
{
public void DoSomething()
{
}
}
Run Code Online (Sandbox Code Playgroud)
DoSomething是否适合内联?我期望“否”,因为如果是接口,则该对象可能会转换为IMyInterface,因此实际调用的方法是未知的。但是,事实是它没有被标记为虚拟,这意味着它可能不在vtable上,因此如果将对象强制转换为MyClass,那么是否可以将其内联?
c# ×8
.net ×2
interface ×2
.net-5 ×1
.net-core ×1
android ×1
azure-devops ×1
inline ×1
ios ×1
maui ×1
msbuild ×1
propertyinfo ×1
reflection ×1
vb.net ×1
xamarin ×1