|
|
When some exception occurs in a class of the .Net framework, we see the public function of a public class called by our code only, the further details (private functions, or even non-public classes) used by the public function are hidden in the StackTrace of the exception object, when the exception occurred somewhere down there.
Now I have some functionality where I'd like to have such a feature, too:
For testing, we use MS Test. I added some extensions, e.g. "ThrowsAssert " (based on Asserting Exceptions in MSTest with Assert.Throws()[^]). When such an Assert fails, I get a long StackTrace like:
bei TestUtilities.ExceptionAssert.OnNoExceptionThrown[T](String _customMessage) in C:\Users\bernhard.hiller\SVN\Product-SW\trunk\C_TestUtilities\ExceptionAssert.cs:Zeile 29.
bei TestUtilities.ThrowsAssert.Throws[T](Action _task, String _expectedMessage, ExceptionMessageCompareOptions _messageOptions, ExceptionInheritanceOptions _inheritOptions, String _customMessage) in C:\Users\bernhard.hiller\SVN\Product-SW\trunk\C_TestUtilities\ThrowsAssert.cs:Zeile 42.
bei MyAssembly.Tests.MyClassTests.MyFunctionTest() in C:\Users\bernhard.hiller\SVN\Product-SW\trunk\MyAssemblyTests\MyClassTests.cs:Zeile 36.
or even longer...
Is there some way to "hide" all those functions of class ThrowsAssert and ExceptionAssert in the StackTrace?
Oh sanctissimi Wilhelmus, Theodorus, et Fredericus!
|
|
|
|
|
As far as I'm aware, the only way to hide methods from the stack trace is to get the compiler to inline them - since they are no longer called, they are no longer available to stack tracing. Unfortunately for you, there is no way that I know of to force the compiler to inline a method - you can force it to not inline, but the reverse does not apply. I understand that you can (in v4.5 and later) hint that you might like it inlined: MethodImplOptions Enum (System.Runtime.CompilerServices) | Microsoft Docs[^] using the AgressiveInlining field, but that is just a suggestion, not an order!
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Take the "stack trace", run it through a "string reader", and eliminate the entries you don't want (via a class or method "name" related to the exception).
I do all my "trace filtering" in the
Application_DispatcherUnhandledException
event handler.
At that point, I can even "continue execution" via "e.handled" (if the situation calls for it).
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
I got a class and I have created an array in the class
<pre>class myclass
{
string array = new string[5];
for (int i = 0; i< array.Length; i++)
{
array[i] = "whatever"
}
}
now I want to transfer this array into my main, maybe create new array at main and just transfer the info. how do i create and
string GetArray() in class to return an array, and how do I get the info into main. thanks
|
|
|
|
|
|
I have a VB.NET class library with a single public function with a single parameter that calls a method to produce the string return value. I referenced it in the C# project, and added a using statement for the namespace. However, I have no success in even coding to use the function from the dll. Can someone point me in the right direction? There are lots of answers to the problem on the web, but none work for me. Here is a portion of the VB dll code. GetSeparators() prepares and returns the string. I am developing the library to get information from a COM library. I have not found a convenient code for C# to use the COM library. The VB dll is NET 3.5 and the C# app is NET 4.6.1.
Public Class HYSYSFetch
<pre>
Private _filename As String
Private _sepstring As String = ""
Public Function FetchSeparators(filename As String) As String
_filename = filename
GetSeparators()
Return _sepstring
End Function</pre>
|
|
|
|
|
All you have to do is create an instance of the containing class, and call the function on that
private void MyFunction()
{
HYSYSFetch hsf = new HYSYSFetch(...);
string result = hsf.FetchSeparators(strPathToFile);
} If that doesn't work, you need to tell us exactly what you get as an error message, and show us the exact code you tried.
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Thank you. This is something I have done a hundred times with projects. But I never used a VB dll with a C# project. I shall remember that the right solution is the simple one.
|
|
|
|
|
Once they are compiled, VB and C# DLLs are the same thing - you can treat them as if they were written in any language. (The same applies to any language which compiles to IL, so F#, Cobol, C++ - all "look the same" once compiled.)
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Griff, Once you cleared the fog and got me started, the rest was easy. Everything works smoothly when the C# application calls the VB.NET library functions. Thanks again.
I needed the VB library because C# doesn't easily communicate with a COM object. And I already had the VB code in a VB application. I develop most of my class libraries with C#, just to keep in practice. My VB application that uses Selenium Basic (Selenium wrapper for VB & VBA) doesn't play with Firefox latest editions. So my need to use C# to make use of Selenium which doesn't work with VB. My main use is to get information from a process simulator and transfer it to a web page, thus eliminating transcribing errors. This takes several technologies to get it to work.
|
|
|
|
|
You're welcome!
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Well, I spoke too soon. The VB dll is not playing well with the C# app. The C# app doesn't recognize a particular method in the dll. Call to a different method works OK. Throws an error, something about Reflection and the wrong number of arguments. But the number of arguments is correct; there is only one. I had an earlier version working, but the C# app was not getting the proper data from the dll which fetches data from a COM app. I'll have to go back to an earlier version and trace the problem.
|
|
|
|
|
Don't forget the error may have "bubbled up" from a method below the one you are calling.
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Turns out I had a few minor errors in the VB code. I found all of them, and cleaned up the code while I was finding them. It all works as it should. I learned a lot with this little project. It was a cascade with a C# app calling a VB.NET dll which in turn called a licensed COM library. So there was lots of opportunity to get the code wrong. Thanks for the help.
|
|
|
|
|
This is the message received. Is there a way around this without changing the GOP?
Severity Code Description Project File Line Suppression State
Error Fody: An unhandled exception occurred:
Exception:
Failed to execute weaver C:\FTDTLRepos\DTPLite\packages\Costura.Fody.3.1.0\netclassicweaver\Costura.Fody.dll
Type:
System.Exception
StackTrace:
at InnerWeaver.ExecuteWeavers()
at InnerWeaver.Execute()
Source:
FodyIsolated
TargetSite:
Void ExecuteWeavers()
Exception has been thrown by the target of an invocation.
Type:
System.Reflection.TargetInvocationException
StackTrace:
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Security.Cryptography.CryptoConfig.CreateFromName(String name, Object[] args)
at System.Security.Cryptography.MD5.Create()
at ModuleWeaver.CalculateHash()
at ModuleWeaver.Execute()
at InnerWeaver.ExecuteWeavers()
Source:
mscorlib
TargetSite:
System.Object InvokeMethod(System.Object, System.Object[], System.Signature, Boolean)
This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms.
Type:
System.InvalidOperationException
StackTrace:
at System.Security.Cryptography.MD5CryptoServiceProvider..ctor()
Source:
mscorlib
TargetSite:
Void .ctor() DTP_Lite
|
|
|
|
|
The code is apparently using MD5, which is not FIPS compliant. Your workstations apparently have a GPO applied to them that enables FIPS, which prevents certain crypto algorithms from being used, like MD5.
You cannot use the library unless you have options to change out the crypto it's using. Contact the people that made that library you're using to see if they have a FIPS-compliant version or can change something in it so it works under FIPS.
If not, you have two choices. Either find and use a different library that is FIPS compliant, or get the network/Windows/Security admins to turn FIPS off. (Being a government installation, good luck with that.)
Read this: Why We’re Not Recommending “FIPS Mode” Anymore
|
|
|
|
|
What you explained, I understand. I'm wondering, however if there's code I can write that will embed the dlls during compile time.
|
|
|
|
|
No, there's no code you write, but you can use ILMerge to combine your .DLL's with your .EXE file. You can get ILMerge from a Nuget package called "ILMerge.Tools". You can then write up a command line in your Post Build Event to run the tool with an appropriate command line to combine your files.
Be warned though. This will result in an executable file the size of your original compiled .EXE plus all of the .DLL's you end up baking into it combined.
But none of this is going to solve that FIPS problem.
|
|
|
|
|
I am unable to get this command to work via a powershell runspace in c#. it works fine in powershell.
Remove-DistributionGroupMember -Identity <groupname> -Member <upn> -Confirm:$false
My guess is that I am not loading the correct command set but I am unable to determine how to do that in this case. This code works for adding users to groups, deleting users, etc, I just change the powershell code to send but for Remove-DistributionGroupMember I get the general command not found error.
any ideas?
public void RemoveUserFromGroup()
{
InitialSessionState iss = InitialSessionState.CreateDefault();
iss.ImportPSModule(new[] { "MSOnline" });
using (Runspace myRunSpace = RunspaceFactory.CreateRunspace(iss))
{
myRunSpace.Open();
using (System.Management.Automation.PowerShell powershell = System.Management.Automation.PowerShell.Create())
{
powershell.Runspace = myRunSpace;
Command connect = new Command("Connect-MsolService");
System.Security.SecureString secureString = new System.Security.SecureString();
string myPassword = loginPassword;
foreach (char c in myPassword)
secureString.AppendChar(c);
connect.Parameters.Add("Credential", new PSCredential(IdSenderEmail, secureString));
powershell.Commands.AddCommand(connect);
Collection<PSObject> results = null;
Collection<ErrorRecord> errors = null;
results = powershell.Invoke();
errors = powershell.Streams.Error.ReadAll();
var PSCommand = "Remove-DistributionGroupMember -Identity '"+IdGroupName+"' -Member '"+IdUPN+"' -Confirm:$false";
powershell.Commands.Clear();
Command getuser = new Command(PSCommand);
powershell.Commands.AddCommand(getuser);
results = null;
errors = null;
try
{
results = powershell.Invoke();
if (results != null && results.Count > 0)
{
foreach (PSObject item in results)
{
IdExceptionError = item.ToString();
}
}
}
catch (Exception ex)
{
IdExceptionError = ex.ToString();
}
finally
{
myRunSpace.Close();
myRunSpace.Dispose();
}
}
}
}
|
|
|
|
|
|
Thanks Richard. Unfortunately that did not resolve this issue changing MSOnline to Exchange. I appreciate the links to the documentation though.
|
|
|
|
|
I went back and re-wrote my script after playing around with this
Programmatic Access via Remote PowerShell in Exchange Server 2010 – You Had Me At EHLO…[^]
Here is the working version in case anyone has a need for it.
public void RemoveUserFromGroup()
{
string connectionUri = "https://outlook.office365.com/powershell-liveid/";
System.Security.SecureString secureString = new System.Security.SecureString();
string myPassword = loginPassword;
foreach (char c in myPassword)
secureString.AppendChar(c);
PSCredential credential = new PSCredential(IdSenderEmail, secureString);
WSManConnectionInfo connectionInfo = new WSManConnectionInfo(new Uri(connectionUri), "http://schemas.microsoft.com/powershell/Microsoft.Exchange", credential);
connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Basic;
Runspace runspace = System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspace(connectionInfo);
PowerShell powershell = PowerShell.Create();
PSCommand command = new PSCommand();
command.AddCommand("Remove-DistributionGroupMember");
command.AddParameter("Identity", IdGroupName);
command.AddParameter("Member", IdUPN);
command.AddParameter("Confirm", false);
powershell.Commands = command;
try
{
runspace.Open();
powershell.Runspace = runspace;
Collection<System.Management.Automation.PSObject> result = powershell.Invoke();
if (powershell.Streams.Error.Count > 0 )
{
IdExceptionError = "Unable to removed User from the Group. You may not have permission.";
}
else
{
IdExceptionError = "Removed User from the Group. It can take several minutes for the change to appear here.";
}
}
catch (Exception ex)
{
IdExceptionError = ex.ToString();
}
finally
{
runspace.Dispose();
runspace = null;
powershell.Dispose();
powershell = null;
}
}
|
|
|
|
|
There are likely many examples for that task available on the web, but I do not know the technical terms.
I have a list of point (in this case, System.Drawing.Point), and I am looking for a closed line around them. All points of the list must be inside, some other points may be inside additionally, but their number should be as low as possible. And, actually, I do not need the line proper: knowing its length is enough.
Finding a rectangle enclosing all the points of the list is very easy - but there are too many other points enclosed. Another issue is that there might be "holes", not all points have a direct neighbor (in "8 neighborhood").
Could you give me some pointers where to look for? Thanks a lot.
Oh sanctissimi Wilhelmus, Theodorus, et Fredericus!
|
|
|
|
|
Hi,
you want a “convex hull” algorithm; there are some excellent articles on the subject right here at CP, mostly by Eric Ouellet.
|
|
|
|