I'm trying to write a Visual Studio Extension that tracks when a new code window is opened. I found a class IVsCodeWindowEvents that seems to provide listener methods for that:
public int OnNewView(IVsTextView pView)
However, I have a problem that I don't know how to register to listen to these events.
My class looks like this:
public sealed class VSTrackerPackage : Package, IVsCodeWindowEvents
In this class, I implement the OnNewView method, but how can I register this listener in my Initialize method?
Yes you can register for Visual Studio events via the DTE and more specifically DTE2.
First step is to get access from your Package via the Initialize method:
public sealed class VSTrackerPackage : Package
{
DTE2 dte = GetService(typeof (DTE)) as DTE2;
}
At this point, I'd recommend attaching to the DocumentEvents.DocumentOpened event. From there you can check if it's a document you are interested in or not. You can also get the Window if you need to interact with it there:
_dte.Events.DocumentEvents.DocumentOpened += document =>
{
//double check this logic.
if (document.Language != "C#")
return;
//do work
//or - load window document.ActiveWindow.
};
If it helps, I have an open source Visual Studio plugin (shameluss plug: pMixins ) that attaches to a number of VS events. Relevant class is on GitHub: https://github.com/ppittle/pMixins/blob/master/CopaceticSoftware.CodeGenerator.StarterKit/Infrastructure/VisualStudioEventProxy.cs. Class definition starts on line 243.
Related
I have a DLL .
And want to send a form/notification to user( who would reference my dll) from this dll.
I just want to build a function inside one class in my dll such that ->, once a user runs his local program and references my dll -> and calls a function that is present in dll -> that particular function should show up a form/notification to user ( from some functionalities in dll )? Is there any other method for the same?
I tried converting the library to a Winform from class library type and that would change its properties into an executable and it would demand presence of the main function. But I am just building a library that can be referenced and when called by the user produces a form at their end?
I tried toast notifications but not .show() method doesnt work inside new ToastContentBuilder() while i call that in a fucntion from my library . Otherwise as an idenpendant console app , it worked fine
Is there a way I can have a project for toast notification in the same solution as that of my library and then call from a class in my main library -> the function present in this different project for toast notif and would produce the toast notification.
You can try the following steps to send a notification to the user from the dll.
First, please create a class library(Target Framework is .NET Core 3.1) called TestDll.
Second, you could install the nuget-package Microsoft.Toolkit.Uwp.Notifications in the class library.
Third, you can add a class and refer to the following code example.
namespace TestDll
{
public class Example
{
public void Setnotifications()
{
new ToastContentBuilder().AddArgument("action", "viewConversation")
.AddArgument("conversationId", 9813)
.AddText("Ev2 Compiler Library")
.AddText("Allow sending build Data to Microsoft")
.AddButton(new ToastButton()
.SetContent("Yes")
.AddArgument("action", "reply")
.SetBackgroundActivation())
.AddButton(new ToastButton()
.SetContent("No")
.AddArgument("action", "like")
.SetBackgroundActivation())
.SetToastScenario(ToastScenario.Reminder)
.Show();
}
}
}
Fourth, please rebuild the class lib and create a console app(Target Framework is .NET Core 3.1).
Fifth, we can add the project reference TestDll to the console app and write the following example in the main method.
static void Main(string[] args)
{
Example example = new Example();
example.Setnotifications();
}
Finally, we can see the notification in the right bottom of computer like the following:
Besides, the problem about 'toast notifications but not .show() method' maybe that you used .net standard framework, you can solve the problem by changing to the .net core framwork.
I'm developing a modular blazor application (5.0.2) using VS 2019 (16.8.4), which is structured as follows:
a "Main" Solution, which consists of
RCL
Wasm project to startup the application
several "Sub" solutions which reference the Main RCL (Base components, etc) which consist of
.net5 libraries (Models, Web-service access, etc)
RCL with components, referencing the .net5 libraries (via project reference)
All projects have a post-build event to copy the DLL and PDB files to a certain path, e.g. D:\TMP.
The SubSolution references the MainRCL library via this path.
The Main Wasm project references the SubRCL library also via this path (for adding services at startup/Program.cs).
The MainRCL does not have a reference to SubRCL (components are rendered via reflection/BuildRenderTree() according to configurable UI definition).
Debugging the Main Solution worked perfectly (IIS Express/Application Debugging).
Then I tried to debug the SubModules -> I started debugging from the MainSolution and opened files from the SubModules projects in this VS instance.
At some libraries, debugging was working, but not for the SubRCL ("Unbound Breakpoint"). Then I was able to reproduce the (very strange) issue with sample solutions:
The "MainRCL" provides 2 Attributes:
[AttributeUsage(AttributeTargets.Class)]
public sealed class TestNoEnumAttribute : Attribute
{
public string Name { get; set; }
public string Mode { get; set; }
public TestNoEnumAttribute(string name, string mode)
{
Name = name;
Mode = mode;
}
}
[AttributeUsage(AttributeTargets.Class)]
public sealed class TestEnumAttribute : Attribute
{
public string Name { get; set; }
public EventExecutionMode Mode { get; set; }
public TestEnumAttribute(string name, EventExecutionMode mode)
{
Name = name;
Mode = mode;
}
}
public enum EventExecutionMode
{
AutomaticAll = 0,
ManualConfiguration = 2
}
The SubRCL uses these attributes at a test-method:
[TestNoEnum("Test", "EventExecutionMode.ManualConfiguration")]
//[TestEnum("Test", EventExecutionMode.ManualConfiguration)]
public class Module1Test
{
public int IncreaseNum(int num)
{
var x = new Part1();
var part1Num = x.DoStuff(num);
var newNum = part1Num + 1;
return newNum;
}
}
The class "Part1()" which is called, is located at another library of the SubSolution
The breakpoint at the "DoStuff()" method in Part1 class is always hit (in separate .net5 library).
The breakpoint at the "IncreaseNum()" method is only called when the [TestEnum] attribute is NOT used.
As soon as the [TestEnum] attribute is used, there is an "Unbound Breapoint"; the breakpoint in "DoStuff()" method in another library is still hit.
Then I tried to "add existing project" to SubSolution and added the MainWasm project and started debugging directly from SubSolution -> same behavior.
Is there anything I oversee (e.g. regarding DLL-references or PDB file copy)?
This is already my second approach of trying to debug these modular-structured solutions - first I tried to debug via IIS (How to debug Blazor Webassembly on IIS with VS by attaching to Chrome?), but this was also not successful.
Found out there is an issue with debugging when using attribues with enum parameters:
https://github.com/dotnet/aspnetcore/issues/25380
-> I replaced the enum parameters and debugging is working fine now - Didn't get any feedback when this will be fixed so far
I had the same issue with my Blazor WASM not able to be debugged in VS due to 'Unbound breakpoint'. I have multiple projects running under the same solution and while initially the debugging worked for the WASM, it stopped after a while.
Eventually I was able to find a work around by waiting until all projects loaded and then I could disable the 'Unbound' breakpoint and re-select it. It then worked as expected.
It's not an ideal solution (especially if you have multiple breakpoints while troubleshooting) but it is workable.
I had this problem in .NET 6 and Visual Studio 2022.
I made a codebehind-file component.razor.cs but I also had code in the razor-file itself. Moving the code to the codebehind-file solved the issue and enabled the breakpoints.
I started using MVVMCross several weeks ago and so far I love it, but I've noticed that whenever I'm working on the UI and making changes in the XAML and pressing save which activates the Hot Reload in Visual Studio 2019, I'm getting Null Reference Exceptions.
This is down to the fact that the MVVMCross' Prepare method is not getting called. According to their doc's this method is used to pass a parameter to the VM which can then be used throughout the VM.
public override void Prepare(MyClass param)
{
MyClass = param;
}
public override Task Initialize()
{
MyClass.DoSomething();
return base.Initialize();
}
So this is the basic usage (I think). However when I Hot Reload the XAML changes Prepare isn't called but Initialize is, which causes the Exception.
Is this a bug ?
Prepare in normal cases will only be called when calling NavigationService.Navigate.
What Hot Reload actually does is unclear. This use case is currently not officially supported by MvvmCross.
I have a ASP.NET 5 , MVC 6 project which has reference to a CL in the same solution.
When I try to debug I am unable to enter to the CL's breakpoints.
When I come to the function calling the CL and hit F11 it just continues , so it doesn't enter into the function for debug.
When I debug and get over to the function of the CL and choose "Step into specific" and choose the function it says :
Microsoft.AspNet.Mvc.Core.pdb not loaded.
Microsoft.AspNet.Mvc.Core.pdb contains the debug information required to find the source for the module Microsoft.AspNet.Mvc.Core.dll
Module Information
Version : 6.00.0.10417
Original Location : <path in local disk>
Try one of the following options :
Change existing PDB and binary search paths and retry:
Microsoft Symbbol Servers
So when I try to get it load from microsoft symbol server it says :
Microsoft.AspNet.Mvc.Core.pdb could not be found in the selected paths
My main project is in MVC 6 and my dll is target framework : .Net 4.5.2
I think that due to the beta nature the pdb files are not on the symbol servers. I would assume that after RTM (remember VS is RC but asp.net 5 is very much still beta) they would be added to the symbol servers.
If you need support before that you can clone the asp.net MVC repository (https://github.com/aspnet/Mvc.git) to a location outside your project. Then in the global.json (solution level file) add that path to the project property. This will instruct the compiler to look there for dependency resolution. The compiler will always attempt to resolve dependency using local source over nuget package. In Visual Studio right click on references > restore packages. You should see the package icon change to indicate source. Then you can simply build, and step directly into the source.
This error can be occurred because of a wrong doing in code. I got this error once where I was implementing a base class and overriding its method without a base method call where my db context was initialized. But in my controller I was trying to use the db context which is still not initialized which caused a null reference error. Once I fixed it this error disappeared.
public class MyController : BaseController
{
private MyService _myService;
protected override void Initialize(RequestContext requestContext)
{
//I missed the base call here
//base.Initialize(requestContext);
_myService = new MyService(myDbContext);
}
}
public class BaseController : Controller
{
public MyDbContext myDbContext { get; set; }
protected override void Initialize(RequestContext requestContext)
{
base.Initialize(requestContext);
myDbContext = HttpContext.GetOwinContext().Get<MongoDbContext>();
}
}
Try deleting the bin folder and rebuilding the solution.
I am having difficulty getting my Monodroid application retrieve a location when I run it in an emulator. My code looks something like this:
LocationManager locationsManager = (LocationManager)threadSurfaceView.Context.GetSystemService(Context.LocationService);
location = locationsManager.GetLastKnownLocation(Android.Content.Context.LocationService);
However, this always seems to return null. Do I have to configure the emulator in some way so that it has a locaion service and/or location?
I also tried adding a LocationListener:
locationListener = new MyLocationListener();
locationsManager.RequestLocationUpdates(LocationManager.GpsProvider, 120000, 0, locationListener);
But the problem I had here was to create the MyLocationListener class. I implemented the four public methods (OnLocationChanged(Location) and so on), but Visual Studio complained about a missing Android.Runtime.IJavaObject method - does anyone have a simple example of a class that implements ILocationListener?
Thanks for any help. Martin
I got a kindly link to a sample at
https://github.com/gshackles/Sample-Projects/blob/master/MonoDroid/MonoDroidSamples/MonoDroidSamples/DemoActivities/LocationDemo/LocationActivity.cs
Which works fine on my Nexus S but still will not work on the emulator - so (perhaps) the issue is not a code issue.
I liked the technique in this sample of getting the "Activity" to implement ILocationListener as well as Activity - a neat solution to getting data back out of the "listener" function which had been giving me headaches when it was wrapped into another class.
I downloaded the bundle of samples and if you do the same then you will need to grab an mp3 file - rename it volbeat.mp3 and add it to the "raw" folder within "Resources" as it is missing.
partial answer as I am working on the same problem.
Your listener class that implements ILocationListener needs to be declared like
public class myLocationListener : Java.Lang.Object, ILOcationListener
{
//plus the public functions you identified
}
My attempt looks like this:
Android.Locations.Location iAmHere;
LocationManager myLoc = (LocationManager)GetSystemservice(Context.LocationService);
iAmHere = myLoc.GetLastKnownLocation(Android.Content.Context.LocationService);
but iAmHere is null on the emulator even when I have used TelNet to push a geo fix location through