Foxtrek_64
Custom Logger
Hi all, been trying to figure this out for a bit now but I'm not sure what's happening. I am writing a custom extension for Microsoft.Extensions.Logging to write to a Sql Server database with a particular schema. However, I'd opted to make it as generic as possible.
After doing a lot of research, I've created a DbLoggingProvider and a MSSqlDatabaseLogger. The logging provider creates new instances of the database logger, as expected, and the database logger expects an instance of a type implementing
ILogAgent
which it forwards its log method to. The log agent is responsible for performing the database-specific operations.
However, when doing unit tests, I am unable to prove that logging works. In fact, it appears to not. Take the following test.
I'm sure that there are better ways to test if a logger is logging (this could in theory pass if something else is writing logs to this table even if the log operation fails), but it's fine for right now while I'm the only person logging to this table. That said, advice on fixing up this test would be appreciated.
Every assert passes except for the assertion that the counts are not equal (they are) and going to the database reveals that my message was not inserted into the log table. I have unit tests that pass for SqlServerAccessor and I am able to demonstrate that, by itself, it is able to insert log entries by executing a non-query and writing directly to the table in question.
The issue appears to be in the glue layer - despite the log agent being present in the same service provider which is producing logger instances, it does not appear to be using my particular logger. I don't see any breakpoints being hit in my logger class, though I am hitting the logger provider several times. What is it exactly that I am missing here?14 replies
SqlConnection Connection Disposed
Hi all,
I have class library which provides a custom type called
SqlServerAccessor
This custom type wraps a SqlConnection
and its ctor accepts a connection string, news up a SqlConnection
, and calls _connection.Open()
.
This type implements IDisposable
and is intended to be used as follows:
Internally, I have a method called EnsureNotDisposed()
to handle use after the type has been disposed which throws an InvalidOperationException
stating the underlying SqlConnection
has been disposed.
Using the code sample from above, this catch is always hit and the sql connection is always closed. There does not seem to be a "keep alive" function or anything - my understanding is that SqlConnection
should keep its connection open until it is manually closed.
I could connect and disconnect for each operation, which might resolve the issue, but the intent is for it to be used in a small using scope like this and calling Dispose()
or Close()
is responsible for closing the connection.
Any idea why the connection is being closed immediately after leaving the ctor?13 replies
VS hangs while typing
Curious if you guys had any ideas
My machine at work is running VS
When I type in the code editor, it's often several seconds before the editor catches up to what I typed and several seconds again before I get suggestions or the intellisense browser.
I've watched memory and cpu usage and I'm seeing neither noticeable spikes nor is either utilization at 100%.
Where should I look to diagnose the lag?
13 replies
Blazor - Identity Scaffolding Fails
Hi all, trying to scaffold identity into a blazor app. I have an
AuthDbContext
that looks like this
When in the scaffolding wizard, I select this db context. It works up to a point, but then I get an exception popup from Visual Studio:
Googling this issue doesn't find me any results for this particular error. Any ideas?14 replies
INumberBase<>.TryConvertFromTruncating()
I have a Bit type which wraps bool and implements INumberBase and IComparable.
I need to implement the TryConvertFromTruncating method
Should I just reimplement my FromSaturating method which returns Bit.One if the value is not zero, otherwise Bit.Zero? Or is there another better implementation.
I do have
int.CreateTruncating()
in the body temporarily but this naturally creates unexpected limitations in the type
The purpose of this type is just to test a case for my SSN type where it should throw if converting to a numeric type that doesn't support 0-9, and no such built in type satisfies this, but it is at least good practice for building an integral numeric type.8 replies
Attribute Style Preference
Not sure if #help is the right place for this but I was hoping for some thoughts on attribute style.
It goes without saying that functionally, the two styles make absolutely no difference. They are handled identically by the compiler.
I have noticed however that decompiled C#, such as when looking at lowered code in SharpLab, tends to prefer style 1. I think that's mostly because it's easier to render it as C# that way, not because of any functional reason.
Which style do you guys prefer, and what is your reasoning? Does it depend, e.g. based on the length of the attribute name or the number of attributes? Do you mix and match styles?
8 replies
SDK Project - Duplicate ExcludeFromCodeCoverage in generated file
Hey all, working on an SDK project and running into an interesting issue and I'm not entirely sure how to fix it. When compiling for tests, my test projects get the following exception:
This attribute is being defined in <Project>.AssemblyInfo.cs, a compiled file.
Background
Initially the
LibraryFrameworks
value below had targeted netstandard2.1 inline with the rest of the libraries. In order to facilitate phasing out of support of this library, we've done a couple things:
1. In Sdk.props, alongside ExecutableFrameworks
and LibraryFrameworks
, we've defined a new boolean property TargetNetStandard
and removed the netstandard2.1 target from LibraryFrameworks
. In order to remain backwards compatibility, TargetNetStandard
defaults to true.
1. In Sdk.Targets, the second TargetFrameworks
definition was added which adds the netstandard2.1 target alongside the standard library frameworks.
Expected Behavior
This should in theory create behavior identical to the original - unless the user opts out by setting <TargetNetStandard>false</TargetNetStandard>
, the default set of target frameworks should include netstandard2.1;net6.0;net7.0;net8.0
(when it's a library type and not an executable type). If the user specifies false, then the netstandard2.1 target should be excluded.
Actual Behavior
JIT building (when saving changes made to Skd.targets) appears to work properly, and Rider shows that my test library TargetNetStandardFalse
appears to update its targets correctly to indicate that it is no longer targeting netstandard2.1. However, running dotnet build
with either debug or release targets results in the duplicate attribute exception, which prevents tests from running. Deleting obj/bin folders has no effect on this behavior, except that it will change which test project receives the error. I imagine this is just dependent on the order the projects are discovered and built rather than some sort of phantom shifting error.
Does anyone know why this is happening or how to fix it?1 replies
✅ Console Logging - No New Lines
Not sure if this is M.E.L or Serilog or Microsoft Terminal doing this
Developing a service as a console app as one does, but when logging to the console, new lines only appear after stack traces. Everything else always appears on the same line.
The
{Newline}
piece in my format doesn't seem to be working either. Exception messages are smashed up against the actual message.
I am running on Windows with NET7 and the latest version of all relevant packages.
Anyone run into this before? Google hasn't8 replies
❔ fluent api naming/design
Hi all, working on designing a fluent api inspired by EF Core, in this case the IEntityTypeBuilder
I am trying to determine language to describe these situations:
Exactly one of (set of properties) required
One or more (set of properties) required
If property 1 is present, property 2 must be present
If any of (set of properties), (set of properties) is required
Here's some I've thought of:
builder.OneOf(x => x.Foo, x => x.Bar)
builder.AnyOf(x => x.Foo, x => x.Bar)
Builder.Required(x => x.Property2).When(x => x.Property1, isPresent: true)
I should note, if a property is always mandatory, it is a naked property in the model (public string Name { get;})
If it is optional or conditionally optional, it exists as an Optional<T>, which helps account for cases where logically null and logically missing are two different scenarios.
6 replies
❔ Net461 Needs Reference to NetStandard 2.0
I'm encountering an error that only gets thrown when executing an app. Building works great. The error says that
System.ValueType
is not defined and I need a reference to netstandard 2.0.0.
I am not using anything that relies on netstandard, nor do I know of anywhere that I'm using System.ValueType
, yet my app seems to think I am. Any thoughts of where I might look?
I would just add a reference as suggested, but I don't have a .csproj. I have a project.json file which only supports nuget.6 replies
✅ Multi-targeting NetFx and NetCore - Targeting wrong version?
History
My last post was a bit of a mess so I've come here to help clean it up a bit.
I have a project called Tafs.Activities.Finance. It multi-targets net461, net462, net6.0, and net7.0. In the project file, I have a few conditional includes. If we're working with NetFx, it includes a reference to Tafs.Activities.Results. If we're working with Net6/7, it instead includes a reference to Remora.Results. These two libraries provide the same types, though for NetFx and Net6.0+ respectively.
In the Finance library, I have a type called SocialSecurityNumber which references a ValidationError. ValidationError exists in a third library: Tafs.Activities.Results.Extensions. The extensions library is set up very similarly to the finance library in its conditional includes.
The ValidationError type implements ResultError, which is provided by either Tafs.Activities.Results or Remora.Results depending on the target.
Intellisense on ResultError does update properly between Tafs.Activities.Results and Remora.Results based on the selected build target.
The Error
When consuming ValidationError in my Finance project, I do so by assigning it to a Result type. The source of the Result type should likewise correspond to the selected build target, and Intellisense does confirm this. NetFx should only be aware of Tafs.Activities.Results and Net6/7 should only be aware of Remora.Results. This assignment operation relies on an implicit converter which handles anything of type ResultError:
I get two exceptions on the return statement when targeting net461 or net462:
Adding a reference to Remora.Results as suggested, even though NetFx can't use it, does resolve the second error, but I think that's a fake error anyways so I'm ignoring that.
What I think is happening is that when the Finance library is referencing Tafs.Activities.Results.Extensions, it's somehow grabbing the Net6/Net7 target, even though the Finance library itself is targeting net461 or net462. If I change the target selector for the finance library to Net6 or Net7, the error goes away and the Result type changes to Remora.Results.Result. I have tried doing a project clean, then building the projects one at a time, but this does not have any effect on the issue. Does anyone have any ideas as to what might be happening here or how to fix it?
8 replies
✅ Multi-target, wrong version
I am multi-targeting a project for NetFx and Net6/7. Specifically, there are four projects in play here:
Remora.Results - Provides the base Result and ResultError types for Net6/7
Tafs.Activities.Results - Provides the base Result and ResultError types for NetFx
Tafs.Activities.Results.Extensions - Conditionally includes Remora.Results or Tafs.Activities.Results based on framework version.
Tafs.Activities.Serialization - Targets Remora.Results or Tafs.Activities.Results based on target version. Additionally targets Tafs.Activities.Results.Extensions for extra error types.
My SocialSecurityNumber class relies on Tafs.Activities.Results.Extensions.Errors.ValidationError. This is happy on NetFx, but on Net6/7, I get an error saying I cannot implicitly convert it to Remora.Results.Result. I would expect this error if it picked the wrong version of the error to provide.
The source code of the ValidationError is this:
Whether it implements Tafs.Activities.Results.ResultError or Remora.Results.ResultError should in theory depend on the dotnet version, but it does not appear to be behaving as such.
To make things even stranger, this framework comparison extends to the csproj too. So in theory, the Net6/7 version shouldn't even be aware of Tafs.Activities.Results.
Any thoughts as to what might be going on here?
4 replies
✅ IsExternalInit Issue Not Found and Duplicate
Hi all, I'm working in a project that multi-targets net461, net461, net6.0, and net7.0. On the net461 target, I'm encountering an error stating "Predefined type 'System.Runtime.CompilerServices.IsExternalInit' is not defined or imported." The
IsExternalInit
nuget package is installed.
StackOverflow suggested that I can create a custom internal class like so:
Adding this class does not get rid of the error, but it does add a new error saying "The namespace 'System.Runtime.CompilerServices.' already contains a definition for 'IsExternalInit'." So it both can't find it and reports a duplicate at the same time. Restarting Visual Studio and deleting obj, bin, and output folders does not resolve the issue.
Any ideas of what might be going on here?20 replies
❔ Recommendations for Fuzzy Equation algorithm
Hi all, I'm looking for recommendations on nuget packages or Linq queries I could use to accomplish a fuzzy equation algorithm.
In my case, are comparing company names to find a match, but because of human entry, the names are inconsistent. For example, you could have "Contoso," "Contoso LLC," and "Contoso llc." And sometimes we have some spelling errors because they're typed by someone listening over the phone. So "Cantoso" could be a possibility, for instance.
Because we use this comparison for verification purposes, we need it to be able to be tuned to eliminate false positives. AI is also a potential candidate but that sounds like a huge can of worms I don't want to get into.
I don't mind rolling my own but ideally I would like to use something actively maintained since this is not an area of expertise.
9 replies
❔ Cannot open output file for writing
Hi all, trying to build my project with Visual Studio. Whenever I do I get an error from CSC stating the following:
To fix this, I have tried closing out of Visual Studio and deleting both the
Selkhound/output
and Selkhound/Selkhound.API.Abstractions/obj
directory, but the next time it builds I just get the same exception on build again. I also get this exception for the Selkhound.Client.dll
file. Building using Visual Studio, with or without cleaning the solution, or using dotnet build
on the command line has the same results.
The build log suggests that the projects are being built multiple times in parallel, though I'm not sure if that's a contributing factor here.
Any thoughts of what I might do to fix this?19 replies
MAUI Entry Point - MauiProgram.cs [Answered]
Typically when creating a new application, be it Console, WPF, WinForms, or Web, the main entry point of the application is
Program.Main()
. I created a new Maui app to find that the main entry point appears to be MauiProgram.CreateMauiApp()
. Why is there a difference in the entry point of the application? Was it intended to mirror the Startup.cs
file from asp.net core apps and they just hid Program.cs
from me?3 replies
SendKeys() Access Denied
I'm using UiPath's SendKeys activity which maps to the SendKeys() function. For some reason, I am experiencing an intermittent access denied error when trying to send F8 to an application. Pressing F8 manually when this error is experienced does not open the F8 window. Restarting the application fixes the error.
When researching this error, the only suggestions online are to disable UAC or run as administrator, neither of which are options due to company policy.
Are there any other suggestions?
14 replies
LINQPad 7 - Insert Record [Answered]
Hi all, I'm using LINQPad to insert records from json into a SQL database.
All of the documentation seems to suggest that it builds a model based on the table that is a singular name of the table (e.g., if the table name is Regions, the model is named Region).
However, this does not seem to be the case for my table, and unfortunately LINQPad seems to lack any sort of intellisense for inspecting the namespace for the correct type name. My table is RVIDocumentCodes but there does not appear to be an RVIDocumentCode type.
The
InsertOnSubmit()
line has an expected error because jsonDocument is the json model. This error is
"Cannot convert from UserQuery.RVIDocumentCodeJson to LINQPad.Users.RVIDocumentCodes".
This tells me that the RVIDocumentCodes type is my model, but there does not appear to be a constructor that I'm allowed to consume. Both of these lines tell me that RVIDocumentCodes doesn't contain a constructor that accepts that many arguments.
What am I missing here?4 replies
JsonPath Query [Answered]
I have some json that looks like this:
Using a JsonPath query, I want to filter results where
IsActive
is true and return the TeamName. I have put together this query:
The way I read it, it should select from teams where IsActive is true, then return the TeamName property, however the resulting teams
object is always null (specifically, for whatever reason it returns List<JsonElement?>?
). Removing the .TeamName
reference at the end also returns a null collection. According to this stackoverflow post, the JsonPath query is properly formatted (https://stackoverflow.com/questions/46931964/json-path-to-check-equals-condition).
Any thoughts of what I might be doing wrong here? I'm using System.Text.Json and the JsonDocumentPath libraries.12 replies