пятница, 19 августа 2011 г.

Com объект для 1С

Возникла необходимость в 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 системах.