Patrice,

Thank you for the clarification, i'll try just that and post back with my
results.

Thanks!

Amit Ben Shahar

2010/4/24 Patrice Guérin <guer...@magic.fr>

>  Amit,
> No, I don't misunderstand you.
> The (real) example I gave is in fact similar (I think so)
> In a classic Win32 application, when mixing different compiler setting,
> different compilers between application and the OpenSSL dll and use some
> functions involving FILE* parameters, applink is used to resolve the crash.
> The actions to do are :
> Add the snippet applink.c or include the file ONLY ONCE in the main
> project.
> I guess the same can be done with .NET application...
>
> When running the application:
> OpenSSL dll will search the application module for the OPENSSL_Applink()
> function.
> If it doesn't find it, OpenSLL exits with a message.
>
> I've never done any application in .NET, just this dll.
> If you take OpenSSL as a pre-built binary, it's probably a Win32 dll (so
> unmanaged), and if you add the snippet in your .NET application and OpenSSL
> does not resolve OPENSSL_Applink(), maybe it's because OPENSSL_Applink() is
> considered as managed code.
> So, maybe, adding #pragma unmanaged at the beginning of applink.c can solve
> your problem.
>
> You can use a tool called "dependancy walker" that show the exe/dlls entry
> points and used dlls
> http://www.dependencywalker.com/
> Just see if OPENSSL_Applink is present or not...
>
>
> Patrice.
>
>
> Amit Ben Shahar a écrit :
>
> Would anyone happen to know how i can eliminate the requirement of the
> applink implementation? why would we actually need it?
>
> Take a look at the other thread I gave you (Win32 OPENSSL_USE_APPLINK
> usage) for further explanations... and the FAQ about Win32 applications that
> crash.
>
>
>
> Amit Ben Shahar
>
> On Sat, Apr 24, 2010 at 13:25, Amit Ben Shahar <amit.b...@gmail.com>wrote:
>
>> Patrice,
>>
>>  I think your have misunderstood me (or i did you),
>> From what you wrote i gather that you are talking about using .Net dlls in
>> native applications, which is not the case here, i need it the other way
>> around.
>> Our server is a .Net application and so we'd either have to somehow get
>> the Uplink/applink to recognize a method in the .Net assembly (i understood
>> that it cannot be in an adjacent dll) OR to completely eliminate the Applink
>> usage.
>>
>>  If i misunderstood please correct me :)
>>
>> Amit Ben Shahar
>> VP R&D
>> ISQ Technologies
>> (+972) 545-592-934
>> a...@isqgroup.net
>> www.isqgroup.net
>>
>>
>> 2010/4/24 Patrice Guérin <guer...@magic.fr>
>>
>>  Hello Amit,
>>>
>>> Maybe you can explore the "IJW" way...
>>> I use Visual C++ 6 to build my aWin32 pplications and I had to use some
>>> .NET Crypto functions such as RSA to communicate with a customer.
>>> I've used Visual C++ 2005 Express, in which I add the Win32 environment
>>> (from a platform SDK. Express don't have Win32 environment by default...) to
>>> compile
>>> the .NET dll and use it from a win32 dll.
>>> The trick is to use #pragma managed / #pragma unmanaged as appropriate
>>>
>>> cryptodotnet.h : the include file for win32/.NET
>>>
>>> #ifndef    CRYPTDOTNET_EXPORT
>>>     #define    CRYPTDOTNET_EXPORT    __declspec( dllimport )
>>> #endif
>>>
>>> #define    CRYPTDOTNET_VERSION    "1.0.0"
>>> #define    CRYPTDOTNET_DATE    "20100228"
>>>
>>> class CRYPTDOTNET_EXPORT CryptDotNet
>>> {
>>>   public:
>>>     CryptDotNet()                    {};
>>>     virtual ~CryptDotNet()        {};
>>>     int RSAEncrypt( const char* XmlPublicKey, const unsigned char* Data, 
>>> const int DataLength, char* Base64EncryptBuffer, int* 
>>> Base64EncryptBufferLength );
>>>     ...
>>> };
>>>
>>>  cryptodotnet.cpp : compiled with VC++2005
>>>
>>> #define CRYPTDOTNET_EXPORT  __declspec(dllexport)
>>> #pragma unmanaged
>>> #include "cryptdotnet.h"
>>> #include <memory.h>
>>> #include <string.h>
>>> #pragma managed
>>>
>>> class    CryptDotNetManaged
>>> {
>>> public:
>>>     CryptDotNetManaged()    {};
>>>     ~CryptDotNetManaged()    {};
>>>     int RSAEncrypt( const char* XmlPublicKey, const unsigned char* Data, 
>>> const int DataLength, char* Base64EncryptBuffer, int* 
>>> Base64EncryptBufferLength );
>>> };
>>>
>>> //Unmanaged interface
>>> int CryptDotNet::RSAEncrypt( const char* XmlPublicKey, const unsigned char* 
>>> Data, const int DataLength, char* Base64EncryptBuffer, int* 
>>> Base64EncryptBufferLength )
>>> //
>>> {
>>>     CryptDotNetManaged    c;
>>>     return c.RSAEncrypt( XmlPublicKey, Data, DataLength, 
>>> Base64EncryptBuffer, Base64EncryptBufferLength );
>>>     }
>>> // Managed part
>>> #pragma managed
>>> using namespace System;
>>> ...
>>> int CryptDotNetManaged::RSAEncrypt( .... )
>>> { ... };
>>>
>>>
>>>  This works very well.
>>> In your case, maybe the applink.c should be considered as unmanaged code.
>>>
>>> some references for inspiration...
>>> http://ondotnet.com/pub/a/dotnet/2003/01/13/intromcpp.html
>>>
>>> http://www.techheadbrothers.com/Articles.aspx/integrez-code-cplusplus-natif-applications-dotnet-page-1(sorry...
>>>  in french...)
>>>
>>> and finally the thread "Win32 OPENSSL_USE_APPLINK usage" in OpenSSL-dev
>>>
>>> Hope this helps.
>>> Patrice.
>>>
>>> Amit Ben Shahar a écrit :
>>>
>>>  On Fri, Apr 23, 2010 at 21:35, James Mansion <
>>> ja...@mansionfamily.plus.com> wrote:
>>>
>>>> Amit Ben Shahar wrote:
>>>>
>>>>> One of the crucial ingredients is ssl using OpenSsl. but we are
>>>>> encountering a problem with the 'no OPENSSL_Applink' error.
>>>>> as this is a .Net project, there is no way (i can think of) to compile
>>>>> with the applink.c file.
>>>>>
>>>>  1) Why is that crucial?  Microsoft provide crypto support on Windows,
>>>> albeit with a different interface.  What's wrong with
>>>> System.Net.Security.SslStream?
>>>>
>>>>
>>> The .Net.Security.SslStream is not working in asynchronous calls, meaning
>>> we'd have to implement it in a thread-per-connection paradigm, which is
>>> obviously not an option.
>>>
>>>
>>>> 2) Why can't you 'compile with the applink.c file'?  You need a talk to
>>>> it through p/invoke - you may need to write another glue DLL to do this.  
>>>> If
>>>> you can locate an OpenSSL implementation that has been wrapped as a
>>>> free-threaded COM service, you might find things easier if you don't know
>>>> how to write such glue.  You could try looking in Mono's runtime, too, 
>>>> which
>>>> I suspect delegates to OpenSsl (tho I haven't checked).
>>>
>>>
>>> As far as i understood it, openSsl looks for the applink implementation
>>> in the actual application and not in dlls, but i could have misread that,
>>> anyhow i'm not sure i would know how to do that, can you maybe directly to
>>> such an implmentation (free-threaded COM) ?
>>> - in the meantime i'll try checking in Mono, though i've never ever
>>> looked at it yet. maybe i'll get lucky ;)
>>>
>>> thanks
>>>
>>>
>>
>

Reply via email to