Возникла необходимость в 1С считать MD5 для файла. Средствами 1С делать это грустно. Было решено сделать Com-объект.
Последовательность действий простая.
Создаём проект Class Library.
Делаем некоторые настройки.
В проекте создаём интерфейс нашего объекта:
using System.Runtime.InteropServices;
namespace MD5HashFile
{
[Guid("3B8D860F-4519-4111-93A0-E6C65982A3D6")]
public interface IHasher
{
[DispId(1)]
string ComputeHash(string path);
}
}
И собственно реализацию:
using System.IO;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
namespace MD5HashFile
{
[Guid("C024A82B-47FE-42B5-B3A7-8CAB66ADFAAE"), ClassInterface(ClassInterfaceType.None), ProgId("MD5HashFile"), ComVisible(true)]
public class Hasher : IHasher
{
#region Implementation of IHasher
public string ComputeHash(string path)
{
if (File.Exists(path))
{
byte[] retVal;
using (var file = new FileStream(path, FileMode.Open))
{
MD5 md5 = new MD5CryptoServiceProvider();
retVal = md5.ComputeHash(file);
file.Close();
}
var sb = new StringBuilder();
for (var i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
else
{
return null;
}
}
#endregion
}
}
Компилируем. Убеждаемся, что всё работает.
Осталось подписать сборку.
Для этого нужно сгенерировать файл ключа. Можно воспользоваться утилитой sn.exe.
Выполнить в коммандной строке sn -k MD5HashFile_Key.snk
Сборка готова.
Публикуем её в операционной системе:
regasm "d:\MD5HashFile.dll" /codebase
И используем где угодно, например в другом приложении .net.
Console.WriteLine("InputFileName");
var filename = Console.ReadLine();
Type comObjType = Type.GetTypeFromProgID("MD5HashFile");
object comObj = Activator.CreateInstance(comObjType);
var hash = comObjType.InvokeMember("ComputeHash", BindingFlags.InvokeMethod, null, comObj, new object[] { filename});
Console.WriteLine(hash);
Console.ReadLine();
Или в нужном нам 1С. Вызов объекта аналогичен вызову, например, Excel.
Что приятно, использовать можно, как на x86, так и на x64 системах.
Последовательность действий простая.
Создаём проект Class Library.
Делаем некоторые настройки.
В проекте создаём интерфейс нашего объекта:
using System.Runtime.InteropServices;
namespace MD5HashFile
{
[Guid("3B8D860F-4519-4111-93A0-E6C65982A3D6")]
public interface IHasher
{
[DispId(1)]
string ComputeHash(string path);
}
}
И собственно реализацию:
using System.IO;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
namespace MD5HashFile
{
[Guid("C024A82B-47FE-42B5-B3A7-8CAB66ADFAAE"), ClassInterface(ClassInterfaceType.None), ProgId("MD5HashFile"), ComVisible(true)]
public class Hasher : IHasher
{
#region Implementation of IHasher
public string ComputeHash(string path)
{
if (File.Exists(path))
{
byte[] retVal;
using (var file = new FileStream(path, FileMode.Open))
{
MD5 md5 = new MD5CryptoServiceProvider();
retVal = md5.ComputeHash(file);
file.Close();
}
var sb = new StringBuilder();
for (var i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
else
{
return null;
}
}
#endregion
}
}
Компилируем. Убеждаемся, что всё работает.
Осталось подписать сборку.
Для этого нужно сгенерировать файл ключа. Можно воспользоваться утилитой sn.exe.
Выполнить в коммандной строке sn -k MD5HashFile_Key.snk
Сборка готова.
Публикуем её в операционной системе:
regasm "d:\MD5HashFile.dll" /codebase
И используем где угодно, например в другом приложении .net.
Console.WriteLine("InputFileName");
var filename = Console.ReadLine();
Type comObjType = Type.GetTypeFromProgID("MD5HashFile");
object comObj = Activator.CreateInstance(comObjType);
var hash = comObjType.InvokeMember("ComputeHash", BindingFlags.InvokeMethod, null, comObj, new object[] { filename});
Console.WriteLine(hash);
Console.ReadLine();
Или в нужном нам 1С. Вызов объекта аналогичен вызову, например, Excel.
Что приятно, использовать можно, как на x86, так и на x64 системах.