Accessing C++ DLL from C#

I'm trying to access functions from a C++ DLL from C#. I neither can reference nor register the dll. Is it possible for me to access the functions within C#?  But it's possible to access the DLL from VB6.


// part of my code is as below:
 
[StructLayout(LayoutKind.Sequential)]
        public struct DataPointValues
        {
            [MarshalAs(UnmanagedType.LPStr, SizeConst = 64)]
            public string pointName;
            [MarshalAs(UnmanagedType.LPStr, SizeConst = 64)]
            public string paramName;
            public int    paramOffset;
            [MarshalAs(UnmanagedType.I2, SizeConst = 1)]
            public int paramType;
            public int paramValue;
        }
 
        [DllImport("hscnetapi.dll", EntryPoint = "rHsc_Param_Value_Put_Bynames")]
        public static extern long rHsc_Param_Value_Put_Bynames(string server, int num_requests, DataPointValues  param_byname_data_array);

Open in new window

LVL 2
szarangerAsked:
Who is Participating?
 
Bob LearnedConnect With a Mentor Commented:
Hmmm, let's revisit a previous comment:

"If it is a COM DLL, then it needs to be registered".

Bob
0
 
Bob LearnedCommented:
There is a huge difference between VB6 and VB.NET/C# when it comes to interfacing with C++ DLLs, especially when it comes to string marshalling.  You need to find juse the right combination of attributes.  It would help if you had the C++ prototype declaration to work from.

Bob
0
 
szarangerAuthor Commented:
Is it possible to access an unmanaged DLL without regitsering it from C#?
0
Cloud Class® Course: Microsoft Exchange Server

The MCTS: Microsoft Exchange Server 2010 certification validates your skills in supporting the maintenance and administration of the Exchange servers in an enterprise environment. Learn everything you need to know with this course.

 
Bob LearnedCommented:
What kind of DLL are you talking about?  If it is a COM DLL, then it needs to be registered.  Otherwise, you should be able to access it with the right p/invoke signature.

Do you have the signature from the C++ DLL, or is it someone else's DLL?

Bob
0
 
szarangerAuthor Commented:
It is third party COM DLL. The signature is as below:

function rHsc_Param_Value_Puts(Server: LPSTR; num_requests: INT; out param_value_data_array: ^SafeArray): INT; stdcall;
0
 
Bob LearnedCommented:
For 'out' parameters, you need the 'ref' keyword:

...ref DataPointValues  param_byname_data_array

The SafeArray is trickier, and I believe that you might be able to use the VariantWrapper to help out:

VariantWrapper Class:
http://msdn2.microsoft.com/en-us/library/system.runtime.interopservices.variantwrapper(vs.80).aspx

Bob
0
 
szarangerAuthor Commented:

When I run the code, it returns me this error:
Unable to find an entry point named 'rHsc_Param_Value_Put_Bynames' in DLL 'hscnetapi.dll'.
[StructLayout(LayoutKind.Sequential)]
        public struct DataPointValues
        {
            [MarshalAs(UnmanagedType.LPStr, SizeConst = 64)]
            public string pointName;
            [MarshalAs(UnmanagedType.LPStr, SizeConst = 64)]
            public string paramName;
            public int    paramOffset;
            [MarshalAs(UnmanagedType.I2, SizeConst = 1)]
            public int paramType;
            public int paramValue;
        }
 
        [DllImport("hscnetapi.dll", EntryPoint = "rHsc_Param_Value_Put_Bynames")]
        public static extern long rHsc_Param_Value_Put_Bynames(string server, int num_requests, ref DataPointValues param_byname_data_array);

Open in new window

0
 
Bob LearnedCommented:
You can use dumpbin (or dependency walker) to view the exports for the DLL to make sure about the entry point name.  It is also possible to use the 'unsafe' keyword and pointers with C# p/invoke signatures.

Example:

Using Unsafe Code in C#
http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=351

Bob
0
 
szarangerAuthor Commented:
Dependancy walker returns:
     rhsc_param_value_put_bynames        as the Function and
      A hexadecimal value as a Entry Point
So it is the same name as what I use.


0
 
szarangerAuthor Commented:
Apparently .NET cannot access a COM DLL without registering it!!!???
0
 
szarangerAuthor Commented:
Thanks Bob.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.