Ich versuche gerade, Assemblies zu signiern. Leider werden die ohne digitale Signatur generiert (kein Reiter "Digitale Signaturen" in den Dateieigenschaften) und irgendwelche Fehlermeldungen erhalte ich auch nicht. Das wäre das Csproj:
Die einzige C#-Datei ist die unangetastete Program.cs. Irgendjemand eine Idee, in welche Richtung ich überhaupt suchen könnte? Die ganzen Google-Ergebnisse soweit gehen halt davon aus, dass es klappt und sind deshalb nicht wirklich hilfreich!
Ah, du meinst, dass ich die Typnamen zum Mappen/Adden selbst aus einer Datei bzw einer ConfigSection entnehme?
Nicht schlecht, daran hab ich gar nicht gedacht! Ist zwar anfangs etwas umständlicher, aber dafür auch flexibler!
durch Konfiguration per Textdatei ersetzen. Das leider nicht mehr weiterentwickelte Unity konnte das und die Funktionalität ist gerade für's Testing ein Riesenvorteil. Lässt sich das auch mit Microsoft.Extensions.DependencyInjection machen?
Laut Microsoft soll ich in den Projektdateien "more open-ended ranges for the dependency rather than an exact version" spezifiziern. Aber das bringt auch keine Veränderung und eigentlich passt die Version 1.1.1 ja.
Irgendjemand eine Ahnung, wie ich das Problem beheben könnte?
Ich habe eine Applikation, die gegen mehrere selbstentwickelte Libraries linkt und möchte die daher bei Debug-Builds via Projektreferenz im VS einbinden, bei Release-Builds hingegen als Nuget-Paket. Gibt es da irgendeine Möglichkeit, die ich bisher übersehen habe? Leider finde ich bei Google nichts, kann aber sein, dass ich die falschen Keywords verwende.
Wenn ich in einem Clickhandler eine async-Methode awaite, funktioniert das problemlos:
private async void Knopf_Click(object sender, RoutedEventArgs e)
{
var id = "BluetoothLE#BluetoothLE12:34:56:78:90:12-12:34:56:78:90:12";
var dev = await BluetoothLEDevice.FromIdAsync(id); // funktioniert
//var dev = Creator.GetDevice(id, Application.Current.Dispatcher.Invoke); // funktioniert nicht
Text.Text = dev.DeviceId;
}
Der gleiche Code in einer Library funktionert aber nicht:
public static BluetoothLEDevice GetDevice(string deviceId, Func<Func<Task>,Task> invoke)
{
BluetoothLEDevice ret = null;
invoke(async () => {
ret = await BluetoothLEDevice.FromIdAsync(deviceId);
});
return ret;
}
Hier wird nicht wirklich awaitet, sondern ret bleibt null.
Wie kann ich durchsetzen, dass auf die Rückkehr von BluetoothLEDevice.FromIdAsync gewaitet wird?
Ja, das erwarte ich von Enrich.WithClientIp(), dass das die Variable hinzufügt.
Wozu ist denn das sonst gut? Nur damit ich das versteh, mein ich. Will hier niemanden kritisiern, nur hat der Entwickler das genauso angegeben, ausser dass er das Output Template setzt, was bei mir ebenfalls nicht funktioniert...
Serilog schaut vielversprechend aus, aber ich kriege nicht einmal die Client IP geloggt. Ich habe:
1. Ein neues WebAPI-Projekt erstellt
2. Folgende Pakete installiert:
Serilog
Serilog.AspNetCore
Serilog.Enrichers.ClientInfo
Serilog.Sinks.Console
3. Folgende Dateien angepasst: Program.cs
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Serilog;
namespace Tests.SerilogWeb
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => {
webBuilder.UseStartup<Startup>();
})
.UseSerilog(new LoggerConfiguration() // Logger instanziern
.MinimumLevel.Debug()
.Enrich.WithClientIp()
.WriteTo.Console()
.CreateLogger()
);
}
}
Startup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.OpenApi.Models;
using Serilog;
namespace Tests.SerilogWeb
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "Tests.SerilogWeb", Version = "v1" });
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment()) {
app
.UseDeveloperExceptionPage()
.UseSwagger()
.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Tests.SerilogWeb v1"));
}
app
.UseSerilogRequestLogging() // <- Hinzugefügt
.UseHttpsRedirection()
.UseRouting()
.UseAuthorization()
.UseEndpoints(endpoints => {
endpoints.MapControllers();
});
}
}
}
WeatherForecastController.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Tests.SerilogWeb.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
_logger.LogInformation("Hier sollte die ClientIp stehen: ->{ClientIp}<-");
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
}
}
Geloggt wird aber der String ohne Ersetzung der IP, also Hier sollte die ClientIp stehen: ->{ClientIp}<-
statt z.B. Hier sollte die ClientIp stehen: ->192.168.1.42<-
Ich möchte in einem Server in Logmeldungen die Client-Ip mitloggen und analog zum LogLevel-Filter die Meldungen auf solche spezifischer Clients reduziern.
Also so wie ich das LogLevel von ERROR auf DEBUG stellen kann, möchte ich eine Liste von IPs konfiguriern, deren Logmeldungen geschrieben werden sollen, während alle anderen ignoriert werden.
Gibt es ein Loggingframework, das sowas bietet?
Sorry wegen dem .Result, das verwende ich in produktivem Code natürlich nicht!
Leider bringt dein Link nichts, weil die Klasse BluetoothComponent Legacy-Code ist (InTheHand.Net.Bluetooth statt InTheHand.Bluetooth).
Aber im Prinzip bräuchte ich genau sowas bei der LE-Library, die jedoch InTheHand.BluetoothLE heisst und nicht InTheHand.Bluetooth.
Weisst du da wie? Leider ist sein Code sehr chaotisch und ich steige nicht so durch.
Vielen Dank für deine Antwort! Es hat mir sehr geholfen, wenn auch indirekt.
Mein Problem war nämlich, dass ich die Methoden für Bluetooth <4 verwendet habe, es sich bei meinen Geräten aber um BluetoothLE (4+) Dinger handelt...
Dieser Code funktioniert soweit:
Jetzt möchte ich das Ganze aber noch awaiten und einen Handler jedes Gerät direkt nach den "Finden" in eine ObservableCollection hinzufügen.
Leider scheint Bluetooth.AdvertisementReceived dafür nicht vorgesehen zu sein (jedenfalls wird das Event nie ausgelöst) und ein anderes finde ich nicht.
Hast du irgendeine Idee?
Ich möchte eine WPF-Applikation erstellen, in der alle BT-Geräte zur Auswahl angezeigt werden. Leider fliegt auf Google/StackOverflow viel verschiedener Code rum, und tatsächlich schlagen auch auf Anhieb beide von mir versuchten Ansätze fehl. Es werden keine BT-Geräte zurückgegeben, obwohl das Betriebssystem sehr wohl welche findet.
using System.Windows;
using Windows.Devices.Enumeration;
namespace BTTests.MWSC
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var picker = new DevicePicker();
picker.Show(new Windows.Foundation.Rect(Left, Top, Width, Height));
}
}
}
Hat hier jemand sowas am Laufen? Oder komme ich um eine UWP nicht herum?
UWP möchte ich eigentlich vermeiden, da ich bisher mit WPF arbeite.
Der Einfachheit halber habe ich auch noch die VS Solution angehängt.
Ich stecke wieder fest, und zwar erhalte ich beim Compiliern der Mapper folgende Fehler (Projekt Fipscode.ORM.Test):
Fehler
(9,49): error CS0234: The type or namespace name 'SloganMapper' does not exist in the namespace 'Fipscode.ORM.Dapper.Fipscode.Entities.Test' (are you missing an assembly reference?)
(10,13): error CS0012: The type 'User' is defined in an assembly that is not referenced. You must add a reference to assembly 'Fipscode.Entities.Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
Könntet ihr euch das vielleicht nochmal ansehen?
Der zu kompilierende Sourcecode wird auch ausgegeben, zum besseren Verständnis.
Lass mich raten: Du meinst Portscanner und willst per TCP herausfinden, welche IP das "Programm" bekommen hat, bzw auf welchem lokalen Port es lauscht?
Dazu böte sich System.Net.Sockets.TcpClient an.
Aber vielleicht erklärst du mal genauer, was du vorhast?
Vielen Dank für deine Unterstützung!
Es geht mir nicht um das CodeGenerator-Projekt, sondern um ORM.Test.
Die Solution kompiliert bei mir auch, aber wenn ich das ORM.Test-Projekt ausführe, kommen diese Fehler:
Fehler
(5,32): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(9,13): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(9,13): error CS0012: The type 'Expression<>' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(9,30): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(10,13): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(10,13): error CS0012: The type 'Expression<>' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(10,33): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
Klappt das bei dir?
Ich möchte wie gesagt auch keinen Source generieren, sondern fertige Typen.
Leider hat das auch keinen Einfluss. Das CLI ist (natürlich) netcoreapp3.1, aber der ganze Rest netstandard2.0.
Könntest du dir das kurz anschauen? So wie ich mich kenne, liegt es an was ganz Blödem...
Der Typ soll natürlich zur Laufzeit generiert werden, generierter Source oder gar eine Installation von VS kann ich nicht voraussetzen.
Im Prinzip hätt ich auch per System.Reflection.Emit.GetILGenerator direkt Bytecode erzeugen können, aber das ist mir zu hoch!
Visual Studio 2019, 16.9.4
Microsoft.CodeAnalysis.CSharp 3.9.0
Ich möchte Dapper ORM-Mappings dynamisch erstellen und verwende dazu folgenden Code:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Emit;
using DFM = Dapper.FluentMap.Mapping;
namespace Fips.ORM.Dapper
{
public class MappersCreator
{
private Type CreateType(Type type, string name, Dictionary<string,string> mappings)
{
var assemblyName = type.Assembly.FullName;
var nspace = type.Namespace;
var sb = new StringBuilder();
foreach (var kv in mappings) {
sb.Append($" Map(m => m.{kv.Key}).ToColumn(\"{kv.Value}\");\n");
}
var code = $@"using Dapper.FluentMap.Mapping;
namespace {nspace}
{{
public class {name}Mapper : EntityMap<{name}>
{{
public {name}Mapper()
{{
{sb.ToString()}
}}
}}
}}";
SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(code);
CSharpCompilation compilation = CSharpCompilation.Create(
assemblyName,
new[] { syntaxTree },
new MetadataReference[] {
MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
MetadataReference.CreateFromFile(type.Assembly.Location),
MetadataReference.CreateFromFile(typeof(DFM.EntityMap<Type>).Assembly.Location),
MetadataReference.CreateFromFile(typeof(Expression<Type>).Assembly.Location),
MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location),
},
new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
);
using (var memoryStream = new MemoryStream()) {
EmitResult result = compilation.Emit(memoryStream);
if (result.Success) {
memoryStream.Seek(0, SeekOrigin.Begin);
Assembly assembly = Assembly.Load(memoryStream.ToArray());
Type ret = assembly.GetType($"{nspace}.{name}");
return ret;
} else {
foreach (var diagnostic in result.Diagnostics) {
Console.WriteLine(diagnostic);
}
return null;
}
}
}
}
}
Leider kriege ich nur folgende Fehler bei compilation.Emit(memoryStream) auf Zeile 51:
Fehler
(5,32): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(9,13): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(9,13): error CS0012: The type 'Expression<>' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(9,30): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(10,13): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(10,13): error CS0012: The type 'Expression<>' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(10,33): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
Ah, tut mir leid wegen der Bilder, hab sie nun angehängt.
Hab nun AuthenticationTypes.SecureSocketsLayer in AuthenticationTypes.Encryption geändert und bekomme immer noch die gleiche Exception geschmissen. Aber gemäss AuthenticationTypes Enum hat der Enum-Member ohnehin den gleichen Wert?
Hallo Abt! Vielen Dank für deine schnelle Antwort!
Ich muss per LDAPS auf das Directory zugreifen, auch von ausserhalb der Domäne.
Kerberos ist dafür offensichtilich nicht notwendig, da es mit Apache Directory Studio ebenfalls geht (ohne Kerberos)
Hab kein AD-spezifisches Subforum gefunden und poste daher hier.
Folgendes C#-Programm funktioniert wie erwartet, wenn es auf dem DC oder einem Member Server ausgeführt wird:
using System;
using System.DirectoryServices;
namespace Tests.LDAP {
class Program {
static void Main(string[] args) {
var server = "dc.domain.example.com";
var port = 636;
var container = "CN=Users,DC=domain,DC=example,DC=com";
var path = $"LDAP://{server}:{port}/{{0}}{container}";
var user = "Administrator@domain.example.com";
var password = "s0m3p4ssw0rd";
var de = new DirectoryEntry(string.Format(path, "CN=User Name,"), user, password, AuthenticationTypes.SecureSocketsLayer);
var prop = de.Properties["cn"]; // <-- Hier wird die Exception geworfen
Console.WriteLine($"cn: {prop}");
Console.ReadKey();
}
}
}
Wenn ich das Programm aber ausserhalb der Domäne laufen lasse, wird folgende Exception geworfen:
Unhandled Exception: System.Runtime.InteropServices.COMException: The server is not operational.
at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
at System.DirectoryServices.DirectoryEntry.Bind()
at System.DirectoryServices.DirectoryEntry.get_AdsObject()
at System.DirectoryServices.PropertyValueCollection.PopulateList()
at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
at System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
at Tests.LDAP.Program.Main(String[] args) in C:\source\Tests\Tests.LDAP\Program.cs:line 17
Wenn ich mit Apache Directory Studio mit folgenden Einstellungen verbinde, funktioniert alles problemlos: Edit Abt: Bilder-Links entfernt.
Es muss sich also um ein Library- oder ein API-Benutzungsproblem handeln.
Hat hier jemand einen Tipp, wie ich das zum Laufen bekommen kann?