|
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.
|
|
|
|
|
You type faster than me
Software rusts. Simon Stephenson, ca 1994. So does this signature. me, 2012
|
|
|
|
|
Convex hull - Wikipedia[^] is probably a good starting point. Good hunting!
Software rusts. Simon Stephenson, ca 1994. So does this signature. me, 2012
|
|
|
|
|
This is the case
I download several Fields to a datatable including an image, that copy to "AccesoryImage"
<br />
Image AccessoryImage = Image.FromStream(newMemoryStream((byte[])SKUInformationDataTable.Rows[AccessoriesRow]["IM_Image"]));
<small> This works great, the problem is that the catalog from de DB had some items whitout a image, and I need to call a default image (from project resources catalog).
How can I make the comparation if the AccessoryImage is NULL or empty I was thinking something like this but dosent work
Image AccessoryImage = Image.FromStream(new MemoryStream((byte[])SKUInformationDataTable.Rows[AccessoriesRow]["IM_Image"]));
var ImagenDefault = new Bitmap(MESWMP.Properties.Resources.ImagenDefaultMan);
if (AccessoryImage == NULL){ AccessoryImage = BitmapToByte(MESWMP.Properties.Resources.ImagenDefaultMan);}
AccessoryRadPanel.BackgroundImage = AccessoryImage;
|
|
|
|
|
Something like this should work:
DataRow row = SKUInformationDataTable.Rows[AccessoriesRow];
Image AccessoryImage = row.IsNull("IM_Image")
? (Image)new Bitmap(MESWMP.Properties.Resources.ImagenDefaultMan)
: Image.FromStream((byte[])row["IM_Image"]);
DataRow.IsNull Method (System.Data) | Microsoft Docs[^]
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
tks a lot, works like a charm!!
|
|
|
|
|
I have your home typical network. We have Spectrum for our ISP. From time to time the router's IP changes. THis is expected of course as I don't want to pay for a static IP address.
What would be involved in writing a small app that detects when the IP address changes? I could of course write some kind of looping process that keeps comparing it somehow, but I was wondering if there is some way of using an event handler.
Any thoughts on this?
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
|
|
|
|